我知道这已经像任何事情一样被讨论过了,但是我找不到可靠的答案。
假设我有一个包含100亿条记录的表,需要在where子句中删除带有标识列的记录。我应该选择哪个选项?
选项1:禁用索引,这将节省开销,以便在删除后重新排列索引,但需要更长的时间来搜索需要删除的行。
选项2:不会对索引执行任何操作,这会快速定位行,但重新排列索引可能需要一些时间。
我更倾向于2选项,但想看看专家会说什么? :)
答案 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。