在聚集索引,大表上的SQL Server中删除性能

Eri*_*röm 8 sql-server performance clustered-index

我有一个超过2000万行的表,当我这样做时:

DELETE [Table] WHERE ID = ?
Run Code Online (Sandbox Code Playgroud)

这需要40秒以上.ID列是群集的.

这是你可以期待的吗?还是可以优化这个?

Dam*_*ver 18

除了他们的答案中包含的优点JNK之外,我看到的一个特殊杀手是当你从引用表中删除一个或多个外键约束的行,以及引用表中的引用列时( s)没有索引 - 你可以在接受删除之前强制对每个表进行表扫描.

  • 问题是相关表上的索引没有外键索引.这使得删除速度变慢.在外键列的所有相关表上创建索引,删除花费0秒. (2认同)

JNK*_*JNK 8

这将取决于你没有告诉我们的很多因素......

删除了多少行? 更多行显然意味着更多时间.

还有其他指标吗? 每个索引都需要更新,而不仅仅是群集.如果要删除10个索引,则需要大约10倍(非常粗略).

还有其他活动吗?如果发生更新或插入,则很可能存在等待和争用.

也很一般来讲,几秒钟的操作需要的数量HIGHLY依赖于你的硬件设置.如果您在桌面计算机上运行此计算机而不是具有高性能阵列和12核心的服务器,则预期会有很大差异.