繁体   English   中英

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

[英]deleting 500 records from table with 1 million records shouldn't take this long

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

delete from sometable 
where tableidcolumn in (...)

我有500条要删除和重新创建的记录。 该表最近增长到超过1个工厂记录。 问题是上面的声明需要5分钟以上才能完成。 我有一个主键和2个非聚集非唯一索引。 我的删除语句正在使用主键。

谁能帮助我了解为什么此声明花了这么长时间以及如何加快它的执行速度?

我首先要看两个方面,锁定和错误的计划。

锁定-运行查询,并在查询运行时查看它是否被其他任何东西阻塞,“如果您发现有任何东西阻塞了您的请求,那么请从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性能如何,您的平均读写时间等是多少?

TL; DR:不要那样做(而不是大的“ in”子句:预加载并使用临时表)。

由于参数数量众多,后端配置未知(即使按照今天的标准应该可以解决),并且无法猜测处理期间的内存大小,因此您可能正在(按顺序)访问堆栈,批处理或内存大小限制, 从此答案开始。 也有可能达到指令大小限制

故障排除注释可能会导致您得到另一个答案。 我的中心点是'in'子句,语句大小,并且所有这些链接都包括建议以预加载临时表并将其与查询一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM