我见过人们假设有些情况说子查询比连接更有效但是我从来没有真正看到过这样一个很好的例子吗?
当您想要在连接上使用子查询时会出现什么情况?
答案 0 :(得分:4)
经典示例是搜索表中没有相应行的行。
SELECT a.*
FROM TableA a
WHERE NOT EXISTS(SELECT NULL FROM TableB b WHERE b.parent_id = a.id)
通常优于
SELECT a.*
FROM TableA a
LEFT JOIN TableB b
ON a.id = b.parent_id
WHERE b.parent_id IS NULL
答案 1 :(得分:2)
当使用带有子查询的EXISTS时,子查询解决方案应该更快(与外连接相比并检查NULL),因为子查询的“评估”在第一行返回后立即终止
我的经验是,大多数情况下,查询优化器无论如何都会选择相同的计划,因此两者之间没有性能差异(至少使用Oracle和PostgreSQL)