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 inin,然后它运行正常。

感谢任何帮助。

【问题讨论】:

Not in 可能会返回更多结果。表中有多少行?您希望返回多少?你有什么索引? 是的,执行计划也会有所帮助,模式(例如,任何一个表中的 PARENT_ALERT_ID 都可以为空,数据类型是否完全匹配),以及您是否尝试了 NOT EXISTS 模式而不是 NOT IN/ 我们需要查看表和索引定义以及查询计划。您可以通过brentozar.com/pastetheplan 共享查询计划。或许改成not exists,见***.com/questions/173041/not-in-vs-not-exists 【参考方案1】:

INNOT IN 的性能可能有点棘手,因为在匹配记录之前,最初会将子查询中的所有数据加载到内存中。所以如果有更多的行,它会耗尽性能。所以尝试使用EXISTSNOT 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 INNOT EXISTS 具有不同的 null 语义。

以上是关于SQL Server 无休止地“执行查询”的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:无休止的 WHILE EXISTS 循环

SQL Server - 执行直接查询与使用 sp_executesql 执行

SQL Server 2017 开发者版安装卡(挂机)无休止

使用 IronPython 在 SQL Server Analysis Services 上执行查询

解析 SQL Server 查询而不针对数据库连接执行查询 [重复]

如何强制 SQL Server 以特定顺序执行查询