我有这样的语句,这些语句超时:
DELETE FROM [table] WHERE [COL] IN ( '1', '2', '6', '12', '24', '7', '3', '5')
我试着做一个在这样的时刻:
DELETE FROM [table] WHERE [COL] IN ( '1' )
到目前为止它是在22分钟,并仍在继续。
该表中有26万行,是四列。
有没有人有任何想法,为什么会这么慢,如何加快步伐? 我做对[COL]非唯一,非聚集索引,我做在哪里。 我使用SQL Server 2008 R2
更新:我在表上没有触发器。
Answer 1:
原因可能导致删除要慢:
- 删除了很多纪录
- 许多指标
- 失踪儿童表的外键索引。 (谢谢@CesarAlvaradoDiaz在评论提到这一点)
- 死锁和阻塞
- 触发器
- 级联删除(要删除这十个父记录可能意味着数以百万计的孩子越来越记录删除)
- 事务日志需要增长
- 许多外国键查看
所以,你的选择是,找出哪些是阻止和修复或在下班时间运行删除时,他们不会对正常生产负荷干扰。 您可以运行批量删除(如果你有触发器很有用,级联删除,或者大量的记录)。 您可以删除并重新创建索引(最好的,如果你能做到这一点在下班时间太)。
Answer 2:
禁用约束
ALTER TABLE [TableName] NOCHECK CONSTRAINT ALL;
禁用索引
ALTER INDEX ALL ON [TableName] DISABLE;
重建索引
ALTER INDEX ALL ON [TableName] REBUILD;
启用约束
ALTER TABLE [TableName] CHECK CONSTRAINT ALL;
再次删除
Answer 3:
删除很多行可能会很慢。 尝试一次删除几个,如:
delete top (10) YourTable where col in ('1','2','3','4')
while @@rowcount > 0
begin
delete top (10) YourTable where col in ('1','2','3','4')
end
Answer 4:
预防措施
检查的帮助下SQL Profiler
此问题的根本原因。 有可能是Triggers
导致执行的延时。 它可以是任何东西。 不要忘了选择Database Name
和Object Name
,同时启动Trace
排除扫描不必要的查询......
数据库名称过滤
表/存储过程/触发器名称过滤
纠正措施
至于你说你的表中包含26万点的记录......和IN Predicate
含有六个值。 现在,每个记录正在搜索中的每个值26万次IN Predicate
。 相反,它应该是内加入像下面......
Delete K From YourTable1 K
Inner Join YourTable2 T on T.id = K.id
插入IN Predicate
值到一个Temporary Table
或Local Variable
Answer 5:
如果你是从删除表中有前/后的DELETE触发器,事中有可能会造成您的延迟。
此外,如果你有外键引用该表,额外的UPDATE或DELETE可能发生。
Answer 6:
这有可能是其他表有FK约束到您的[表]。 所以DB需要检查这些表,以保持引用完整性。 即使你有相应的这些FKS所有需要的索引,检查他们的金额。
我有这种情况时,NHibernate的错误创建重复FK s的同样列,但以不同的名称(这是由SQL服务器允许的)。 它已大大放缓DELETE语句的运行。
Answer 7:
是[COL]真的是抱着号码,或者你能摆脱围绕值单引号字符字段? @Alex是正确的,在比=慢,所以如果你能做到这一点,你会更好:
DELETE FROM [table] WHERE [COL] = '1'
但更好的方法是使用数字,而不是字符串,找到行(SQL喜欢的数字):
DELETE FROM [table] WHERE [COL] = 1
也许尝试:
DELETE FROM [table] WHERE CAST([COL] AS INT) = 1
在这两种情况下,请确保您有列[COL]索引,以加快表扫描。
Answer 8:
检查这个delete语句的执行计划。 看看,如果索引查找使用。 还什么是山坳的数据类型?
如果使用的是错误的数据类型,变化更新语句(如从“1”到1或N'1' )。
如果使用索引扫描可以考虑使用一些查询提示 ..
Answer 9:
我读这篇文章是真正有用的故障排除任何不便
https://support.microsoft.com/en-us/kb/224453
这是waitresource该密钥的情况下:16:72057595075231744(ab74b4daaf17)
-- First SQL Provider to find the SPID (Session ID)
-- Second Identify problem, check Status, Open_tran, Lastwaittype, waittype, and waittime
-- iMPORTANT Waitresource select * from sys.sysprocesses where spid = 57
select * from sys.databases where database_id=16
-- with Waitresource check this to obtain object id
select * from sys.partitions where hobt_id=72057595075231744
select * from sys.objects where object_id=2105058535
Answer 10:
如果你在表中删除所有记录,而不是有选择的几个可能更快,只是删除并重新创建表。
Answer 11:
在我的情况下,数据库的统计数据已成为腐败。 该声明
delete from tablename where col1 = 'v1'
是花30秒,即使没有匹配的记录,但
delete from tablename where col1 = 'rubbish'
立即跑了
赛跑
update statistics tablename
固定的问题
Answer 12:
打开CMD并运行此命令
NET STOP MSSQLSERVER
NET START MSSQLSERVER
这将重新启动SQL Server实例。 尝试在您的删除命令后,再次运行
我有一个批处理脚本命令,并从时间运行时间,如果我遇到这样的问题。 普通PC重启不会是相同的,所以重新启动实例是最有效的方法,如果您遇到与SQL Server的一些问题。
文章来源: Delete statement in SQL is very slow