Oracle SQL全外连接

时间:2010-11-10 18:22:56

标签: sql oracle

我使用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 (+)
;

有谁知道为什么会这样?

4 个答案:

答案 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不是我经常需要的东西,所以最近没有回到它的基准测试。