一、拆分分区(SPLIT)
在已有分区上添加一个新分区。
如下图所示,将分区03拆分成03和04分区,拆分方式先锁定旧03分区的所有数据,后将旧03分区相关数据迁移到分区04,最后删除旧03上的对应分区数据;这种操作大量消耗io,造成的io日志读写是转移数据的四倍。因此在管理分区上,一般提前添加分区;例如当前03分区没有数据的情况下,我们完成04分区的添加。
添加分区步骤:
1、指定下一个分区的文件组
2、拆分分区
--添加分区 USE [PartionTest] ALTER PARTITION SCHEME [pc_PartionTest01] NEXT USED [PartionTest201412] USE [PartionTest]; ALTER PARTITION FUNCTION [pf_PartionTest01]() SPLIT RANGE('2014-12-11')
下图表示分区添加成功:
二、合并分区(Merge)
分区数据的迁移后,需要分区合并,也就是将无用分区删除,分区合并同拆分一样,会造成大量的io消耗;因此通常会将此分区数据切分出去,分区无数据则可以合并相关分区。
由于合并是将两个分区合并,因此存在是将需要合并的分区界限点往左合并还是往右合并呢?这取决于Range 方式,若Range LEFT 则 往右合并,RANG RIGHT 则往左合并。
通过以上拆分分区得出的分区4,现将分区4合并,有余Range right分区方式,因此分区4是往左合并,将合并到分区3。以下执行结果可以证明此观点。
USE [PartionTest]; ALTER PARTITION FUNCTION [pf_PartionTest01]() Merge RANGE('2014-12-11')
通过下图可以看出:只剩下分区3
四、分区切换(SWITCH PARTITION )
切换分区可以快速有效的管理数据子集。可以使用ALTER TABLE …SWITCH PARTITION ..语句。在分区移动时,只是修改相关的元数据,并未移动数据;因此切换速度非常快。
切换分区需要符合以下要求:http://msdn.microsoft.com/zh-cn/library/ms191160(v=sql.105).aspx
1、原表与目标表结构必须相同,且必须在同一个文件组中。
2、目标表或者分区必须是空的。
3、若源表存在聚集分区索引,则要求目标表也需要有同样的聚集分区索引。
4、源表的所有索引必须与源表分区对齐。
5、若目标表存在索引,约束,外键,要求源表必须与目标表相同结构的索引,约束,外键。
6、目标表和源表都不能存在复制分发。
7、分区依据列是否可为空的约束必须相同。
一般切换分区可以做如下处理:
-
将现有表作为分区分配到现有的已分区表。
ALTER TABLE [dbname].[dbo].[tablename] SWITCH TO [dbname].[dbo].[staging_tablename] PARTITION source_partition_number_expression
-
将分区从一个已分区表切换到另外一个已分区表中。
ALTER TABLE [dbname].[dbo].[tablename] SWITCH PARTITION source_partition_number_expression TO [dbname].[dbo].[staging_tablename] PARTITION source_partition_number_expression
-
将一个分区切换到现有表中。
ALTER TABLE [dbname].[dbo].[tablename] SWITCH PARTITION source_partition_number_expression TO [dbname].[dbo].[staging_tablename]
四、$PARTITION
为任何指定的分区函数返回分区号,一组分区列值将映射到该分区号中。
[ database_name. ] $PARTITION.partition_function_name(expression)
/*返回某个值属于某个分区*/ SELECT $PARTITION.pf_PartionTest01('2014-12-26 00:00:00.000') /*查询某个分区的所有值*/ select * from [dbo].[PartionTest01] where $PARTITION.pf_PartionTest01(salesDate)=2