从包含100万条记录的表中删除500条记录不应该花这么长时间

时间:2015-04-30 14:36:25

标签: sql sql-server sql-server-2008 sql-delete

我希望有人可以帮助我。我有一个简单的sql语句

delete from sometable 
where tableidcolumn in (...)

我有500条记录要删除并重新创建。该表最近增长到超过1万条记录。问题是上面的声明花了5分多钟而没有完成。我有一个主键和2个非聚集的非唯一索引。我的删除语句使用的是主键。

任何人都可以帮助我理解为什么这句话花了这么长时间以及如何加快它的速度?

2 个答案:

答案 0 :(得分:0)

我首先会看到两个方面,即锁定和糟糕的计划。

锁定 - 运行您的查询并在其运行时查看是否被其他任何内容阻止"从sys.dm_exec_requests中选择*其中blocking_session_id<> 0"如果你看到任何阻止你的请求的话,我会先看看:

https://www.simple-talk.com/sql/database-administration/the-dba-as-detective-troubleshooting-locking-and-blocking/

如果没有锁定,那么获取插入的执行计划,它在做什么?它特别高吗?

除此之外,您期望它需要多长时间?它比那更长还是更长一点?它是否只是在它显着增长之后变得如此缓慢,或者它在很长一段时间内变得越来越慢?

什么是I / O性能,平均读/写时间等等。

答案 1 :(得分:0)

TL; DR:不要这样做(而不是大'in'子句:preload并使用临时表。)

随着参数的数量,未知的后端配置(即使它按照今天的标准会好)并且无法猜测处理过程中你的内存大小,你可能会遇到(按顺序)从memory size开始的堆栈,批处理或this answer限制。也可以点击instruction size limit

故障排除评论可能会引导您另一个答案。我的pivot是'in'子句,语句大小,并且所有这些链接都包含advice来预加载临时表并将其用于您的查询。