SQL Server 无休止地“执行查询”
Posted
技术标签:
【中文标题】SQL Server 无休止地“执行查询”【英文标题】:SQL Server is "Executing Query" endlessly 【发布时间】:2021-10-28 02:52:08 【问题描述】:我正在尝试运行一个简单的查询,但它没有返回任何结果,并且无休止地显示“正在执行查询”。
这是我的代码:
select *
from ALERTTRAN_01
where PARENT_ALERT_ID not in (select PARENT_ALERT_ID
from nonbulkclosealert)
但是当我将代码更改为
select *
from ALERTTRAN_01
where PARENT_ALERT_ID in (select PARENT_ALERT_ID
from nonbulkclosealert)
注意not in
到in
,然后它运行正常。
感谢任何帮助。
【问题讨论】:
Not in
可能会返回更多结果。表中有多少行?您希望返回多少?你有什么索引?
是的,执行计划也会有所帮助,模式(例如,任何一个表中的 PARENT_ALERT_ID 都可以为空,数据类型是否完全匹配),以及您是否尝试了 NOT EXISTS 模式而不是 NOT IN/
我们需要查看表和索引定义以及查询计划。您可以通过brentozar.com/pastetheplan 共享查询计划。或许改成not exists
,见***.com/questions/173041/not-in-vs-not-exists
【参考方案1】:
IN
和NOT IN
的性能可能有点棘手,因为在匹配记录之前,最初会将子查询中的所有数据加载到内存中。所以如果有更多的行,它会耗尽性能。所以尝试使用EXISTS
和NOT EXISTS
,就像这样
select *
from ALERTTRAN_01
where not EXISTS (
select PARENT_ALERT_ID
from nonbulkclosealert WHERE PARENT_ALERT_ID = ALERTTRAN_01.PARENT_ALERT_ID
)
这里有一些有用的链接将解释 EXISTS
相对于 IN
的优势
https://www.sqlservercentral.com/blogs/not-exists-vs-not-in
https://www.red-gate.com/hub/product-learning/sql-prompt/consider-using-not-exists-instead-not-subquery
【讨论】:
它们之间的区别与性能无关,与语义有关:NOT IN
与 NOT EXISTS
具有不同的 null 语义。以上是关于SQL Server 无休止地“执行查询”的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:无休止的 WHILE EXISTS 循环
SQL Server - 执行直接查询与使用 sp_executesql 执行
SQL Server 2017 开发者版安装卡(挂机)无休止
使用 IronPython 在 SQL Server Analysis Services 上执行查询