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

时间:2011-06-20 11:52:35

标签: sql-server performance clustered-index

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

DELETE [Table] WHERE ID = ?

需要40秒以上。 ID列已群集。

这是你能期待的吗?或者是否可以对此进行优化?

3 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:8)

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

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

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

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

另外一般来说,操作所需的秒数 HIGHLY 取决于您的硬件设置。如果你在台式机上运行它而不是具有高性能阵列和12核的服务器,那么期望将会非常不同。

答案 2 :(得分:0)

还尝试批量删除数据。实施例

set rowcount 10000
delete [table] where id = ? 
while @@rowcount >0
begin
delete [table] where id = ? 
end