Why partition? Scale-up vs.Scale-out 避免昂贵的硬件开销 使得数据可在一个合适的level上管理 消除资源瓶颈,最小化维护成本
SQL Server 2005分区表和索引概念: 物理分区,具有标准表和索引相关的所有属性和功能 大型表或索引经过分区后更容易进行管理,因为这样您可以快速高效地管理和访问数据子集,同时维护数据集合的完整性。通过分区,从OLTP向OLAP系统加载数据这样的操作只需几秒钟,而不是像未分区时那样需要数分钟或数小时。由于对数据子集执行的维护操作只是针对所需数据而不是整个表,因此效率也提高了。 已分区表和已分区索引的数据划分为分布于一个数据库中多个文件组的单元。数据是按水平方式分区的,因此多组行映射到单个的分区。单个索引或表的所有分区都必须位于同一个数据库中。在SQL Server 2005中,数据库中的所有表和索引都视为已分区表和索引,即使这些表和索引只包含一个分区。
设计分区: 在对表或索引进行分区前,必须计划创建数据库对象: 分区函数 分区方案
分区函数定义如何根据某些列(称为分区依据列)的值将表或索引的行映射到一组分区。一张表最多可以有1000个分区
分区方案将把分区函数指定的每个分区映射到文件组。一个分区方案仅可以使用一个分区函数。但是,一个分区函数可以参与多个分区方案。
最后,在创建表或索引的时候指定分区方案。
实现分区: 创建分区函数-->CREATE PARTITION FUNCTION partition_function_name(input_parameter_type)AS RANGE[LEFI | RIGHT] FOR VALUES([boundary_value[,...n]])[;] CREATE PARTITION FUNCTION myRangePF1(int)AS RANGE LEFT FOR VALUES(1,100,1000);
分区 1 2 3 4
values col1<=1 col1>1 AND col1<=100 col1>100且col1<=1000 col1>1000
实现分区: 创建分区方案-->CREATE PARTITION SCHEME partition_scheme_name AS PARTITION partition_function_name [ALL] TO ({file_group_name | [PRIMARY]} [,...n]) [;] CREATE PARTITION SCHEME myRangePS1 AS PARTITION myRangePF1 TO(test1fg,test2fg,test3fg,test4fg);
实现分区: 增强分区-->ALTER PARTITION SCHEME myRangePS1 NEXT USED [test5fg]; ALTER PARTITION FUNCTION myRangePF1()SPLIT RANGE(500);
合并分区-->CREATE PARTITION FUNCTION myRangePF1(int) AS RANGE LEFT FOR VALUES(1,100,1000); ALTER PARTITION FUNCTION myRangePF1()MERGE RANGE(100);
实现分区: 创建分区表-->CREATE TABLE PartitionTable(col1 int,col2 char(10)) ON myRangePS1(col1); 创建分区索引-->Create index IX_col2 on PartitionTable(col2) ON myRangePS1(col1); Create index IX_col1 ON PartitionTable(col1)
查询分区信息: 使用$PARTITION函数 访问已分区表的分区子集中的所有行。-->Select * from PartitionTable where $PARTITION.myRangePF1(col1)=2 检查每个分区中有多少行。-->SELECT $PARTITION.myRangePF1(col1),COUNT(*) FROM PartitionTable GROUP BY $PARTITION.myRangePF1(col1), 确定包含特定分区键值的行位于哪个分区中-->SELECT $PARTITION.myRangePF1(10)
Case Study: 以adventureworks数据库中的TransactionHistory表和TransactionHistoryArchive为例。 TransactionHistory和TransactionHistoryArchive表是按TransactionDate字段分区的。 每个分区的值范围为一个月。TransactionHistory表维护年度中最新的事务,而TransactionHistoryArchive维护以前的事务。 TransactionHistory有12个分区,分别存放从2003-9到2004-8月(含8月以后)的数据。 TransactionHistoryArchive有两个分区,分别存放2003-9月之前和之后的数据 在每个月开始,TransactionHistory表中当前具有的最早一个月的数据将被切换到TransactionHistoryArchive表中
本文转自 叶俊生 51CTO博客,原文链接:http://blog.51cto.com/yejunsheng/161363