要执行SQL查询需要很多时间

问题描述

| 我有两张桌子。表2包含更多近期记录。 表1具有90万条记录,而表2具有相同的记录。 要执行以下查询,大约需要10分钟。表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
有人可以帮我优化上面的查询还是写一些更有效的东西? 还有如何解决超时问题呢?     

解决方法

        优化器可能会选择阻塞整个表,因为如果需要删除那么多行,这样做会更容易。在这种情况下,我将大块删除。
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。 另一种方法是使用“ 2”事务。这样,在删除行时不会阻塞表读取器。     ,        请稍等,您是否要执行此操作...
DELETE Table1 WHERE ID NOT IN (SELECT ID FROM Table2)
? 如果是这样,那就是我的写法。 您也可以尝试更新两个表的统计信息。当然,在Table1.ID和Table2.ID上的索引可以大大加快速度。 编辑:如果您正在从设计器中获取超时,请在SSMS中增加\“ Designer \”超时值(默认值为30秒)。工具->选项->设计器-> \“覆盖表设计器更新的连接字符串超时值\”->输入合理的数字(以秒为单位)。     ,        两个ID列都需要一个索引 然后使用更简单的SQL
DELETE Table1 WHERE NOT EXISTS (SELECT * FROM Table2 WHERE Table1.ID = Table2.ID)