您好,欢迎访问一九零五行业门户网

关于Oracle full outer join 的bug问题分析及处理

full (outer) join是用来全连接两个表的语法。即希望将a表和b表关联,能够得到a表中有而b表中没有的记录,或者b表中有而a表中没有
full (outer) join是用来全连接两个表的语法。即希望将a表和b表关联,能够得到a表中有而b表中没有的记录,或者b表中有而a表中没有的记录。
如何判断是否有该记录,则通过on子句来关联。
下面是一个例子:
sql> with
  2  a as(select 1 a, 2 b from dual),
  3  b as(select 2 a, 3 b from dual)
  4  select * from a full join b
  5      on a.a=b.a
  6  /
a          b          a          b
---------- ---------- ---------- ----------
        1          2         
                                  2          3
了解了以上基本原理后,我们应该知道,理论上讲,a表和b表的在from子句中的顺序是没有关系的,也就是不影响结果。但是,实际上,却出现了这样的问题,下面是对这种情况的描述:
--------------------------------------------------------------------------------------------
| id  | operation                | name            | rows  | bytes | cost (%cpu)| time    |
--------------------------------------------------------------------------------------------
|  0 | select statement        |                | 12791 |  349k|    82  (3)| 00:00:01 |
|  1 |  view                    |                | 12791 |  349k|    82  (3)| 00:00:01 |
|  2 |  union-all              |                |      |      |            |          |
|*  3 |    filter                |                |      |      |            |          |
|*  4 |    hash join right outer|                | 12790 |  1124k|    41  (3)| 00:00:01 |
|  5 |      table access full  | jxc_risharesum  |  1735 | 78075 |    7  (0)| 00:00:01 |
|  6 |      table access full  | jxc_alltradeday | 12790 |  562k|    33  (0)| 00:00:01 |
|*  7 |    hash join anti        |                |    1 |    76 |    41  (3)| 00:00:01 |
|*  8 |    table access full    | jxc_risharesum  |    1 |    45 |    7  (0)| 00:00:01 |
|  9 |    table access full    | jxc_alltradeday | 12790 |  387k|    33  (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
从以上执行计划来看,在第四步骤,,使用的是hash join rigth outer连接方式。而通过改变两表的摆放顺序,得到如下的执行计划:
-----------------------------------------------------------------------------------------
| id  | operation            | name            | rows  | bytes | cost (%cpu)| time    |
-----------------------------------------------------------------------------------------
|  0 | select statement      |                |  1876 | 52528 |    82  (3)| 00:00:01 |
|  1 |  view                |                |  1876 | 52528 |    82  (3)| 00:00:01 |
|  2 |  union-all          |                |      |      |            |          |
|*  3 |    filter            |                |      |      |            |          |
|*  4 |    hash join outer  |                |  1874 |  164k|    41  (3)| 00:00:01 |
|  5 |      table access full| jxc_risharesum  |  1735 | 78075 |    7  (0)| 00:00:01 |
|  6 |      table access full| jxc_alltradeday | 12790 |  562k|    33  (0)| 00:00:01 |
|*  7 |    hash join anti    |                |    2 |  152 |    41  (3)| 00:00:01 |
|*  8 |    table access full | jxc_alltradeday |    2 |    90 |    33  (0)| 00:00:01 |
|  9 |    table access full | jxc_risharesum  |  1735 | 53785 |    7  (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
注意,此时,执行计划中的第四个步骤,变成了:hash join outer方式。这个才是我们所期望的方式。那究竟是什么导致了这个变化呢?查看他们的谓词连接逻辑:
hash join right outer的:
其它类似信息

推荐信息