可以终止此DELETE查询吗?

时间:2018-08-16 01:17:04

标签: sql sql-server

我运行查询以从数据库中删除大约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此查询安全吗?

1 个答案:

答案 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;

它绝对不会变慢,但是它可以提高性能,具体取决于您的模式,数据以及表具有的任何索引的状态。