我应该在删除数据之前禁用聚簇索引吗?

时间:2013-06-05 14:26:52

标签: sql-server

我知道这已经像任何事情一样被讨论过了,但是我找不到可靠的答案。

假设我有一个包含100亿条记录的表,需要在where子句中删除带有标识列的记录。我应该选择哪个选项?

选项1:禁用索引,这将节省开销,以便在删除后重新排列索引,但需要更长的时间来搜索需要删除的行。

选项2:不会对索引执行任何操作,这会快速定位行,但重新排列索引可能需要一些时间。

我更倾向于2选项,但想看看专家会说什么? :)

3 个答案:

答案 0 :(得分:7)

“选项1”无论如何都不是一个选项。

禁用群集索引会使整个表无法访问,无论如何您都无法在桌面上运行DELETE。它将失败

  

查询处理器无法生成计划,因为索引...   被禁用。

生成此错误的示例代码。

CREATE TABLE T(X INT CONSTRAINT PK PRIMARY KEY CLUSTERED, Y INT);

ALTER INDEX PK ON T DISABLE

DELETE FROM T

答案 1 :(得分:5)

  

假设我有一个包含100亿条记录的表,需要在where子句中删除带有标识列的记录。我应该选择哪个选项?

如果要删除(或插入)超过10%的表(10亿条记录),则应删除所有非群集索引,删除记录,然后重建非群集索引。

如果您删除的表格少于10%,请保留索引。

您可以自由地进行性能测试,看看10%规则是否适用于您的SQL Server数据库引擎。

答案 2 :(得分:0)

您通常会删除表中任何批量插入的索引,这也是临时持续时间。批量插入完成后,将创建索引。

索引可以帮助您轻松找到更新/删除操作的记录,在这种情况下您永远不会想要删除它们。

HTH。