我有一个存储过程,它会在插入新数据(基于其他表中的数据、计算等)之前截断一些表,每个表大约有 175 万行。
基本大纲很简单:
- 截断表
- 以每次大约 75,000 条的“批次”插入 175 万行。
我想知道是否应该在此过程中的任何时候明确地重新构建索引?例如
- 截断表
ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90)
[或类似的东西]- 插入 175 万行
也许
ALTER INDEX ALL ON xxx DISABLE
- 截断表
- 插入 175 万行
ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90)
[或类似的东西]
任何帮助表示赞赏......不是 DBA - 非常了解 DB 的开发人员更准确!
与大多数此类问题一样,这取决于。对于所有涉及的索引,您不太可能以“正确”顺序插入数据,这意味着所有这些索引在插入过程中可能会遇到大量页面拆分。因此,让我们假设您以聚集索引顺序插入。您可以禁用所有非聚集索引、截断、插入,然后重建所有非聚集索引。当然,尝试这两种方法会告诉你,无论背后的理论如何,哪种方法更快。:)
启用所有索引的基本计划可能会很慢并且可能导致碎片。
ALTER INDEX REBUILD 在一个被截断的空表上没有用,所以你需要修改你的计划 A。它应该是:
它可能仍然很慢,但至少你得到了清晰的索引。
B计划很好。测试所有三个,看看哪个最快,哪个索引碎片最少。然后决定重建是否值得。