我运行查询以从数据库中删除大约400万行。在笔记本电脑断开网络连接之前,它已经运行了大约12个小时。到那时,我决定看一下数据库中查询的状态。我发现它处于path
状态。具体来说:
suspended
*这里是有问题的sql查询:
Start Time SPID Database Executing SQL Status command wait_type wait_time wait_resource last_wait_type
---------------------------------------------------------------------------------------------------------------------------------------------------
2018/08/15 11:28:39.490 115 RingClone *see below suspended DELETE PAGEIOLATCH_EX 41 5:1:1116111 PAGEIOLATCH_EX
看完这篇文章
https://dba.stackexchange.com/questions/87066/sql-query-in-suspended-state-causing-high-cpu-usage
我意识到我可能应该将其分解成小块以删除它们(甚至是一个一个地删除它们)。但是现在,我只想知道DELETE FROM T_INDEXRAWDATA WHERE INDEXRAWDATAID IN (SELECT INDEXRAWDATAID FROM T_INDEX WHERE OWNERID='1486836020')
这个查询对我来说是否“安全”,正如该帖子中的答案所示。所选答案指出的一件事是,如果您在执行查询的过程中KILL
,可能会遇到“数据一致性问题”。如果它导致我要删除的数据出现问题,则不必担心。但是,我更担心这会导致其他数据或表结构本身出现问题。
KILL
此查询安全吗?
答案 0 :(得分:2)
如果您通过笔记本电脑在网络上运行delete
,但它与服务器的连接断开,则可以kill
的spid或等待其消失。取决于您的SQL Server实例的@@version
,特别是补丁的修补程度,后者可能需要重新启动实例。
关于一致性问题,您似乎误会了。仅当您在一个批处理中运行多个语句而不被事务包装时,才有可能。据我了解,您只有一个陈述;如果是这样,不必担心一致性,如果破坏数据如此容易,SQL Server就不会变成现在的样子。
但是,我将重写查询,如果T_INDEX.INDEXRAWDATAID
列中包含NULL,则可能会遇到问题。最好通过join
进行重写,同时添加批量拆分:
while 1=1 begin
DELETE top (10000) t
FROM T_INDEXRAWDATA t
inner join T_INDEX i on t.INDEXRAWDATAID = i.INDEXRAWDATAID
WHERE i.OWNERID = '1486836020';
if @@rowcount = 0
break;
checkpoint;
end;
它绝对不会变慢,但是它可以提高性能,具体取决于您的模式,数据以及表具有的任何索引的状态。