你研究过执行计划吗?我怀疑性能问题比 exists 的最终使用更深层次,如果完整的查询可用 - 或者至少是其结构的完整表示,这将有所帮助。在评论中,您指出了这种更复杂的结构:
SELECT
1
FROM table_A AS a
LEFT JOIN ( -- << why a left join, is it achieving anything?
SELECT
* -- << not literally select * I hope
FROM table_B AS b
JOIN table_C AS c
ON b.thing = c.thing
WHERE B.ColumnA IN ( -- << avoid this type of IN()
SELECT -- >> if this result is big
columnX
FROM table_D AS d
)
) AS x
ON a.thing = x.thing
;
在外部查询中,您(或至少表明)仅执行“选择 1”,因此无需在嵌套子查询中选择无关字段。
您指出使用了左连接,但对细节知之甚少,我无法判断它是否需要。
如果子查询产生大量行,性能会下降,那么寻找改进的最明显地方可能是使用 IN(subquery here)。加入或使用 EXISTS 可能是更好的选择。
编辑:关于获取执行计划,考虑从最内层嵌套开始独立运行每个子查询:
SELECT -- >> if this result is big
columnX
FROM table_D AS d
是否使用索引,返回多少行(也许只是为此做一个计数(*))
从那里开始到下一个子查询,并考虑替代方案。例如,这可能有效:
SELECT
thing -- << only that which is needed
FROM table_B AS b
JOIN table_C AS c
ON b.thing = c.thing
JOIN (
SELECT distinct -- >> not a fan of distinct but might help here
columnX
FROM table_D
) AS D
ON B.ColumnA = D.columnX
这篇文章的执行计划告诉你什么?
像这样工作应该有助于整体优化。