1

我继承了一个 SQL Server,并且发现了一个表分区问题。由于我不确定的原因,我无法将新分区添加到现有表分区。

环境:

SQL Server 2005 Enterprise,数据库大小约为 400GB,4GB RAM,仅限 32 位系统。

分区表详细信息:

*表在多个磁盘卷上的 13 个文件组中分区。

*分区函数为 RANGE LEFT,具有 12 个边界点,它们是日期时间值。

*边界点采用日期季度结构(例如:2009-12-31 23:59:59、2010-03-31 23:59:59、2010-06-30 23:59:59)。

*日期时间值是分区键。

*数据根据当前日期每天插入到表中,但是只有最后一个文件组接收数据,因为函数的最后一个边界点是'2010-06-30 23:59:59'。

*表有一个与表对齐的聚集索引,以及 3 个非唯一非聚集索引(2 个对齐,1 个完全存在于不同的文件组中)。

*当前表卷详细信息:

数据空间:75GB+

索引空间:50GB+

行数:2亿+

问题:

当前最后一个文件组/分区没有最大日期边界点,因此日期 '2010-06-30 23:59:59' 之后的所有数据已经​​/仍在插入到此分区中。幸运的是,事务数据量相当小,但在两年的时间里,最终分区已增长到令人印象深刻的 22GB 大小。我不希望从这个现有分区中拆分或删除数据。但是,我确实想添加一个新文件组并更改现有的分区功能,以便将所有未来的数据插入到新的文件组中。我想添加一个新的未来日期作为边界点,以便在该日期之后插入的所有数据都进入一个新的文件组/分区。

使用方法:

使用 ALTER DATABASE 函数添加了一个新的文件组/文件 - SUCCESS

更改了分区方案,以便为新创建的文件组分配 'NEXT USED' - SUCCESS。--用于改变分区方案的脚本--

ALTER PARTITION SCHEME [partition_scheme_name] NEXT USED (new_filegroup_name);

更改了分区函数以添加新的边界点 - FAIL

--用于向函数添加新边界点的脚本--

ALTER PARTITION FUNCTION partition_function_name() SPLIT RANGE ('2012-10-01 23:59:59) GO

错误:

使用 SPLIT RANGE 技术将新边界点添加到现有分区失败,因为数据库事务日志已填满(限制为 18GB)。这让我感到惊讶,原因有两个 - 1):我认为使用 SPLIT RANGE 只是一个元数据函数(如果我错了,请纠正我)和 2):我的新边界点在表中尚不存在作为日期值,所以我假设不会有数据移动。

到目前为止我已经尝试过:

*我使用测试服务器成功测试了此方法,但数据集要小得多。

*然后我将生产数据库的完整副本恢复到测试系统上。我添加了第二个无限增长的数据库日志文件,并尝试再次更改分区功能。原数据库事务日志按预期填满,但辅助数据库事务日志增长到 60GB!此外,tempdb 增长到 14GB。当整个进程由于另一个错误而再次中止时,新文件组的大小开始增加。这次的错误是:

('无法在具有唯一索引'Index_name'的对象'table_name'中插入重复的键行)。

现在有两件事让我完全困惑:

1):测试错误中提到的索引是非聚集、非唯一索引 - 为什么会出现重复错误?

2):更重要的是,我正在添加一个新的日期时间值作为新的最大边界点,并且该值在表中尚不存在。为什么会有数据移动???

如前所述,我已经使用更小的数据集测试了这种方法,并且效果很好。我不明白为什么它不适用于生产数据集。我在这里遗漏了一些非常明显的东西吗?任何意见是极大的赞赏。感谢您的时间。

4

1 回答 1

0

我认为您想要对分区表进行分区,并且我看到您使用的命令是正确的,我认为您最好尝试在“创建方案查询”中添加新边界并添加新文件组到“创建与方案相关的函数查询”,以便它可以完美地工作,通过这样做,以前文件组中存在的数据将得到拆分。

所以你最好在“创建方案和创建函数”查询的源代码中尝试。:)

于 2012-10-10T08:58:16.420 回答