0

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

我可以删除所有外键关系、统计信息和索引,但我不能修改列,因为分区模式仍然依赖于 tran_date 列。

在我的研究中,我找到了一种将表移出分区的方法,即删除聚集索引,然后将聚集索引重新写入 PRIMARY 文件组,这将允许我修改列,但此操作需要要删除几个小时,在 PRIMARY 上编写临时 CLUSTERED INDEX 需要 13 个小时,然后我必须删除它,更改表,然后正确地重新编写 CLUSTERED INDEX,这需要另外 13 个小时。另外我有不止一张桌子。

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

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

4

1 回答 1

1

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

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

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

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

最后一点,在复制 gobs 数据时,最好将 insert 分成几个 insert,以免事务日志膨胀。

于 2011-08-23T15:33:17.170 回答