我使用FULL OUTER JOIN连接2个表,运行6分钟并输出。
SELECT *
FROM tab1 FULL OUTER JOIN tab2
ON tab1.id = tab2.id
;
我使用LEION OUTER JOIN和RIGHT OUTER JOIN的UNION做同样的事情。这只用了15秒
SELECT *
FROM tab1, tab2
WHERE tab1.id (+) = tab2.id
UNION
SELECT *
FROM tab1, tab2
WHERE tab1.id = tab2.id (+)
;
有谁知道为什么会这样?
答案 0 :(得分:3)
两个表中可能有很多行,共有几行,而且相关列上没有索引。
答案 1 :(得分:2)
检查解释计划。请记住,您指定的两个查询在逻辑上不相同。第二个查询消除了重复行(UNION),但第一个查询没有。这可能是对性能差异的解释的一部分。
答案 2 :(得分:0)
FULL OUTER JOIN
与其他连接类型有所不同,因为不能选择单个前导表。
有效处理它的唯一方法是MERGE JOIN
,但Oracle
不会选择它。
Oracle
为您的查询提供哪个计划?
答案 3 :(得分:0)
我在Oracle 9.2中遇到了这个问题。可以通过将FULL OUTER JOIN
分解为左外连接和右反连接(或其他什么?)来解决它。
SELECT a.*, b.*
from tableA a
left outer join tableB b on (a.a = b.a)
union all
SELECT a.*, b.*
from tableA a
right outer join tableB b on (a.a = b.a)
where a.a is null
这几乎是您提供的查询,但使用UNION ALL
并从查询的第二部分删除重复项而不是使用UNION
。有时我甚至无法从中获得性能,并且需要进一步打破查询,但不记得涉及到什么。
对我而言,Oracle 10的情况似乎有所改善,但FULL OUTER JOIN
不是我经常需要的东西,所以最近没有回到它的基准测试。