如何解决要执行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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。