将表移离分区

时间:2011-08-23 15:13:19

标签: sql-server sql-server-2005 database-partitioning

我有一个非常大的表(800GB),它有一个DATETIME字段,它是分区模式的一部分。该字段名为tran_date。我遇到的问题是索引没有与分区正确对齐,我不能在PRIMARY KEY中包含tran_date字段,因为它设置为可为空。

我可以删除所有外键关系,统计信息和索引,但我无法修改列,因为分区架构仍依赖于tran_date列。

在我的研究中,我找到了一种方法将表移离分区,即删除聚簇索引,然后将聚簇索引重新写入PRIMARY文件组,然后允许我修改列,但是这个操作需要几个小时才能完成,13个小时就可以在PRIMARY上写下临时的CLUSTERED INDEX然后我必须删除它,改变表格,然后重新写入CLUSTERED INDEX,这需要另外13个小时。另外我有一张桌子。

当我在开发环境中使用类似大小的数据集测试此部署时,需要几天才能完成,因此我正在尝试寻找削减此时间的方法。

如果我可以将表移离分区而不必在PRIMARY上写一个CLUSTERED INDEX,那么它将显着减少更改列所需的时间。

1 个答案:

答案 0 :(得分:1)

无论如何,您最终都会将数据从“A点”(存储在数据库中的表分区中)移动到“B点”(存储在数据库中的表分区中)目标是最小化您处理所有数据的次数。最简单的方法可能是:

  • 创建新的非分区表
  • 将数据复制到该表
  • 删除原始表格
  • 将新表重命名为正确的名称

要处理的一个问题是聚集索引。您可以创建没有聚簇索引的新表,复制数据,然后重新索引(额外的时间和痛苦),或者您可以使用聚簇索引创建表,并按“按顺序”复制数据(例如,低Ids到高)。这比将其复制到非聚集表要慢,但总体上可能更快,因为您不必构建聚簇索引。

当然存在“如果用户在复制时更改数据会怎么样”的问题......但是表分区意味着仓库,所以我猜你不必担心。

最后一点,在复制大量数据时,最好将插入符分成几个插入,以免使事务日志膨胀。