我有两张桌子。表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
有人可以帮助我优化上面的查询或写一些更高效的内容吗? 还有如何解决超时问题?
答案 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)