扩展分区表

noj*_*lag 5 sql-server partitioning sql-server-2012

我有一个包含四年数据的表,每个月我都有一个基于包含两个文件的文件组的分区。没想到又收到了八年的数据,准备了这些年的数据库文件和文件组。

当前的方案涵盖 200901 - 201512,我现在需要添加 200001 - 200812。使分区表联机的最佳方法是什么?

  • 创建新的分区方案和分区函数,并将聚集索引更改为这个新的分区方案;或者
  • 我可以以某种方式改变现有的分区方案和分区功能吗?

我问是因为当前表有 180 亿行,我想以有效的方式做到这一点:)

bri*_*ian 5

以下是与问题相关的两个分区最佳实践:

  1. 在分区范围的最左端和最右端保留一个空的暂存分区,以确保加载新数据时分区分裂,卸载旧数据后合并,不引起数据移动。
  2. 不要拆分或合并已填充数据的分区,因为这会导致严重的锁定和爆炸性的日志增长。

http://www.informit.com/articles/article.aspx?p=1946159&seqNum=5

如果分区的最左端为空,请使用ALTER PARTITION FUNCTION SPLIT RANGE向分区函数添加新范围。

要检查最左边的分区是否为空,请使用如下查询:

DECLARE @PartitionFunctionName sysname = 'YourPartitionFunctionNameHere';

SELECT 
p.partition_number, SUM(pst.row_count) RowCountInPartition, pf.name PartitionFunction, ps.name PartitionScheme
FROM sys.dm_db_partition_stats pst
INNER JOIN sys.partitions p ON pst.partition_id = p.partition_id
INNER JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id
INNER JOIN sys.partition_schemes ps ON ps.data_space_id = i.data_space_id
INNER JOIN sys.partition_functions pf ON ps.function_id = pf.function_id
WHERE pf.name = @PartitionFunctionName
GROUP BY p.partition_number, pf.name, ps.name;
Run Code Online (Sandbox Code Playgroud)

如果第一个分区不为空,最佳实践建议您创建一个包含所有值的新函数,在该函数上创建一个新表,然后将数据插入到新表中。

此外,如果左侧分区只有几条记录,则拆分可能没问题。不确定,因为我从未尝试过。

无论您做什么,请确保在完成后在最左侧和最右侧的分区中留下一些空分区。我什至可能会为 0 和 1 创建分区范围,然后添加检查约束以防止第一个分区在其中获取数据。最后做同样的事情。