我继承了一个SQL Server,我发现了一个表分区问题。由于我不确定的原因,我无法将新分区添加到现有的表分区。
环境:
SQL Server 2005 Enterprise, 数据库大小约400GB, 4GB RAM, 仅限BIT系统。
分区表详细信息:
*表分区在多个磁盘卷上的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。由于不同的错误,当整个过程再次中止时,新文件组的大小开始增加。这次错误是:
('无法在对象'table_name'中插入具有唯一索引'Index_name'的重复键行。)
现在有两件事让我感到困惑:
1):测试错误中提到的索引是非聚集,非唯一索引 - 为什么会出现重复错误?
2):更重要的是,我添加了一个新的日期时间值作为新的最大边界点,并且该值尚未存在于表中。为什么会有数据移动?
如上所述,我使用更小的数据集测试了这种方法,并且它工作得很好。我不明白为什么它不适用于生产数据集。我错过了一些非常明显的东西吗?任何意见是极大的赞赏。谢谢你的时间。
答案 0 :(得分:0)
我认为您想要的是对分区表进行分区,我看到您使用的命令是正确的,我认为您最好尝试在“创建方案查询”中添加新边界和添加将新文件组添加到“创建与Scheme相关的函数查询”,以便它可以完美地工作,通过这样做,以前的Filegroup中的数据将被拆分。
因此,您最好尝试查询“创建方案并创建函数”的来源。 :)