【发布时间】:2016-01-25 15:18:45
【问题描述】:
我们正在这样做:
SELECT x from d where x not in
(
SELECT xx FROM a
INNER JOIN aa ON a.col = aa.col
UNION
SELECT xx FROM b
INNER JOIN bb on a.col = bb.col
)
当我们单独运行子查询时,它在10秒内执行并返回0条记录,因为INNER JOIN中使用的表之一是空白的
但是,当我们运行整个查询时,它会持续运行超过 2 个小时,并且永远不会结束。
当整个查询运行时,我们希望看到来自 d 的所有数据,但是为什么查询会挂起?
【问题讨论】:
-
执行计划是什么?
-
NOT IN 子查询永远不应该返回 NULL,将
WHERE xx IS NOT NULL添加到两个选择中。 -
尝试使用 NOT EXISTS
-
可能是错字,但派生表中的最后一个查询将
a.col = bb.col作为连接条件,应该是b.col = bb.col。此外,最好在该查询中使用 UNION ALL(除了任何其他优化)。
标签: sql sql-server