正如上一篇文章SqlServer性能优化——Partition(创建分区)中所述,分区并不是一个一劳永逸的操作,对一张表做好分区仅仅是开始,接下来可能需要频繁的变更分区,管理分区。
在企业管理器中,虽然有“管理分区”的菜单,里面的内容却可能与你的预想不同,这里并没有提供直接对分区进行操作的方法,所以一些普通的操作,比如“增加分区”、“删除分区”之类的操作就需要通过脚本实现了。
“增加分区”事实上就是将现有的分区分割开,基于此,在SQL Server中应用的是Split操作。在分离分区的时候,不仅仅要在Partition Function上指定分割的分界点,同样需要在Partition Scheme上指定新分区应用的文件组:
--指定下一个分区应用文件组PRIMARY ALTER PARTITION SCHEME [MyPartitionSchema] NEXT USED [PRIMARY] --指定分区分界点为5000 ALTER PARTITION FUNCTION MyPartitionFunction() SPLIT RANGE (5000)
需要注意的一点是,新增的分区中非聚簇索引的压缩模式会被置为None。
“删除分区”同样可以认为是将原来分离的分区合并在一起,所以对应的是Merge操作,而且由于并没有新增的分区,Partition Scheme并不需要改变:
ALTER PARTITION FUNCTION MyPartitionFunction () MERGE RANGE (5000)
“切换分区”可能是一个比看上去会应用的更频繁的操作,它的意义在于将一个分区的数据从一张表切换到另一张表中。这里定义被切换分区的表为“源表”,被切换到的表为“目标表”,则执行切换操作的前提是:
下面的操作将源表的第二个分区切换到目标表的第二个分区中。
ALTER TABLE [STable] SWITCH PARTITION 2 TO [DTable] PARTITION 2
分割、合并以及切换分区是元数据上的操作而不是对数据的移动,所以操作的效率要比直接操作数据高很多。
除了利用上文提到的通过“管理压缩”的方式查看某张表的分区信息之外,SQL Server还提供了一张系统表查看数据库中的分区情况:
比如可以通过如下的脚本,查出分区函数MyPartitionFunc的第一个分区的右边界:
SELECT value FROM sys.partition_range_values, sys.partition_functions
WHERE sys.partition_functions.function_id = sys.partition_range_values.function_id AND sys.partition_functions.name = 'MyPartitionFunc' AND boundary_id = 1
还可以通过如下脚本,获取分区表中各分区的数据情况(行数,最大值,最小值):
SELECT partition = $PARTITION.MyParitionFunc([ParitionDate]) ,rows = COUNT(*) ,min = MIN([ParitionDate]) ,max = MAX([ParitionDate]) FROM [MyTable] GROUP BY $PARTITION.MyParitionFunc([ParitionDate]) ORDER BY PARTITION
具体可以参照MSDN:从已分区表和索引中查询数据和元数据