执行SQL查询需要花费大量时间

时间:2011-06-15 01:40:54

标签: sql sql-server tsql

我有两张桌子。表2包含更多最近的记录。 表1有900K记录,表2有相同的记录。

执行以下查询大约需要10分钟。 <= p>,表1中的大多数查询(在执行下面的查询时)都会给出超时异常。

    DELETE T1
    FROM Table1 T1 WITH(NOLOCK)
    LEFT OUTER JOIN Table2 T2
    ON T1.ID = T2.ID
    WHERE T2.ID IS NULL AND T1.ID IS NOT NULL

有人可以帮助我优化上面的查询或写一些更高效的内容吗? 还有如何解决超时问题?

3 个答案:

答案 0 :(得分:1)

优化器可能会选择阻止整个表,因为如果需要删除那么多行,它会更容易。在这种情况下,我会以块的形式删除。

while(1 = 1)
begin
    with cte
    as
    (
        select *
        from Table1
        where Id not in (select Id from Table2)
    )
    delete top(1000) cte

    if @@rowcount = 0
        break

    waitfor delay '00:00:01' -- give it some rest :)
end

因此查询一次删除1000行。优化器可能只会锁定一个页面来删除行,而不是整个表。

此查询执行的总时间会更长,但不会阻止其他调用方。

免责声明:假设MS SQL。

另一种方法是使用SNAPSHOT交易。这样,在删除行时,不会阻止表读者。

答案 1 :(得分:0)

等一下,你想要这样做......

DELETE Table1 WHERE ID NOT IN (SELECT ID FROM Table2)

如果是这样,那就是我写它的方式。 您还可以尝试更新两个表的统计信息。当然,Table1.ID和Table2.ID上的索引可以大大加快速度。

编辑:如果您从设计人员那里获得超时,请在SSMS中增加“Designer”超时值(默认为30秒)。工具 - &gt;选项 - &gt;设计师 - &gt; “覆盖表设计器更新的连接字符串超时值” - &gt;输入合理的数字(以秒为单位)。

答案 2 :(得分:0)

两个ID列都需要索引

然后使用更简单的SQL

DELETE Table1 WHERE NOT EXISTS (SELECT * FROM Table2 WHERE Table1.ID = Table2.ID)