我有一个非常大的表(800GB),它有一个DATETIME字段,它是分区模式的一部分。该字段名为tran_date。我遇到的问题是索引没有与分区正确对齐,我不能在PRIMARY KEY中包含tran_date字段,因为它设置为可为空。
我可以删除所有外键关系,统计信息和索引,但我无法修改列,因为分区架构仍依赖于tran_date列。
在我的研究中,我找到了一种方法将表移离分区,即删除聚簇索引,然后将聚簇索引重新写入PRIMARY文件组,然后允许我修改列,但是这个操作需要几个小时才能完成,13个小时就可以在PRIMARY上写下临时的CLUSTERED INDEX然后我必须删除它,改变表格,然后重新写入CLUSTERED INDEX,这需要另外13个小时。另外我有一张桌子。
当我在开发环境中使用类似大小的数据集测试此部署时,需要几天才能完成,因此我正在尝试寻找削减此时间的方法。
如果我可以将表移离分区而不必在PRIMARY上写一个CLUSTERED INDEX,那么它将显着减少更改列所需的时间。
答案 0 :(得分:1)
无论如何,您最终都会将数据从“A点”(存储在数据库中的表分区中)移动到“B点”(不存储在数据库中的表分区中)目标是最小化您处理所有数据的次数。最简单的方法可能是:
要处理的一个问题是聚集索引。您可以创建没有聚簇索引的新表,复制数据,然后重新索引(额外的时间和痛苦),或者您可以使用聚簇索引创建表,并按“按顺序”复制数据(例如,低Ids到高)。这比将其复制到非聚集表要慢,但总体上可能更快,因为您不必构建聚簇索引。
当然存在“如果用户在复制时更改数据会怎么样”的问题......但是表分区意味着仓库,所以我猜你不必担心。
最后一点,在复制大量数据时,最好将插入符分成几个插入,以免使事务日志膨胀。