在SQL Delete语句很慢(Delete statement in SQL is very sl

2019-06-25 05:52发布

我有这样的语句,这些语句超时:

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:

  1. 禁用约束

    ALTER TABLE [TableName] NOCHECK CONSTRAINT ALL;

  2. 禁用索引

    ALTER INDEX ALL ON [TableName] DISABLE;

  3. 重建索引

    ALTER INDEX ALL ON [TableName] REBUILD;

  4. 启用约束

    ALTER TABLE [TableName] CHECK CONSTRAINT ALL;

  5. 再次删除



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 NameObject 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 TableLocal 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