在 10 亿条记录表上重新创建索引

Ama*_*mam 6 index sql-server-2008-r2 partitioning

我有一个包含超过 10 亿条记录的表,它有 6 个索引(包括聚集索引 (ID))。我需要在带有日期列的新聚集索引上对该表进行分区。我在 ldf 文件中有足够的空间 (150gb) 在索引重建的情况下增长(tempdb 关闭)。

请帮助我以一种有效的方式在新的分区功能/方案上重建索引。这两种方法中的哪一种是一种高效且资源消耗较少的方式(或推荐任何其他方法)?

1.

  • 删除现有 CIX 并删除所有 N-CIX
  • 在 PScheme 上创建 CIX
  • 在 PScheme 上创建对齐/非对齐索引

2.

  • 仅删除 CIX
  • 在 PScheme 上创建 CIX
  • 创建对齐/非对齐索引(使用 DROP_EXISTING)ON

谢谢

usr*_*usr 2

现在,回答这个问题的最佳方法是建立一个较小的几 GB 测试数据库。它将准确预测最佳技术。

您的技术 (2) 很糟糕,因为步骤 1 导致所有 NCI 都被重建以与生成的堆表一起工作。不要那样做。

好消息是DROP_EXISTING可以更改索引定义,包括列和分区方案:

现有索引被删除并重建。指定的索引名称必须与当前存在的索引相同;但是,可以修改索引定义。例如,您可以指定不同的列、排序顺序、分区方案或索引选项。

这就是这个功能存在的原因。它等于先丢弃,然后再创建。

以下是基本技术(由于中间堆表,您的所有技术都很糟糕):

  1. 删除所有 NCI、重建 CI WITH (DROP_EXISTING = ON)、创建丢失的 NCI
  2. 删除所有未对齐的 NCI,重建 CI WITH (DROP_EXISTING = ON),创建缺失的 NCI
  3. 重建 CIWITH (DROP_EXISTING = ON)

(1)事务日志非常轻。它没有达到最大效率。(3) 是最简单的 - 它将导致所有索引被重建为对齐索引。这不太好,因为您将不得不重建那些您不想对齐的内容。

(2) 可能在所有情况下都是最好的。我想不出任何情况可能会更糟。它的优点是重用现有索引以进行更有效的重建(这是可能的,因为您不只是删除所有 NCI)。您想要不对齐的 NCI 不会从这种方法中受益,并且会被不必要地重建。因此,在开始手术之前先将它们除去。

所有这些实际上都可以在线运行,尽管您说您不需要它。

同样,只需在示例数据库上尝试一下即可。当然,您不应该将数据库的可用性托付给我的建议。我建议您借鉴这篇文章中的想法并尝试一下。