NATIVE_FULL_OUTER_JOIN

一网友问一sql的优化,语句就不贴了,噼里啪啦一大堆,主要结构是select * from (里面一大堆) a full join ()。看plan就可以了

--------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name                     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                          |    30M|    26G|       |  8761K  (2)| 03:28:58 |       |       |
|   1 |  VIEW                                   |                          |    30M|    26G|       |  8761K  (2)| 03:28:58 |       |       |
|   2 |   UNION-ALL                             |                          |       |       |       |            |          |       |       |
|*  3 |    HASH JOIN OUTER                      |                          |   109K|   106M|    52M|  4491K  (2)| 01:47:08 |       |       |
|   4 |     MERGE JOIN                          |                          |   109K|    50M|       |   285K  (2)| 00:06:50 |       |       |
|   5 |      SORT JOIN                          |                          |  4084K|  1546M|       |   285K  (2)| 00:06:50 |       |       |
|   6 |       VIEW                              |                          |  4084K|  1546M|       |   285K  (2)| 00:06:50 |       |       |
|   7 |        HASH GROUP BY                    |                          |  4084K|   494M|   602M|   285K  (2)| 00:06:50 |       |       |
|*  8 |         HASH JOIN                       |                          |  4084K|   494M|       |   168K  (2)| 00:04:01 |       |       |
|*  9 |          TABLE ACCESS FULL              | T_xxxx_OUT               |  9815 |   335K|       |   226   (2)| 00:00:01 |       |       |
|* 10 |          TABLE ACCESS FULL              | T_xxxx_OUT_LINE          |  4084K|   358M|       |   167K  (2)| 00:04:01 |       |       |
|* 11 |      SORT JOIN                          |                          |    10 |   920 |       |     8  (13)| 00:00:01 |       |       |
|  12 |       VIEW                              |                          |    10 |   920 |       |     7   (0)| 00:00:01 |       |       |
|* 13 |        FILTER                           |                          |       |       |       |            |          |       |       |
|* 14 |         CONNECT BY WITH FILTERING       |                          |       |       |       |            |          |       |       |
|* 15 |          TABLE ACCESS FULL              | T_*****_ORGA             |    36 |   972 |       |     8   (0)| 00:00:01 |       |       |
|  16 |          NESTED LOOPS                   |                          |       |       |       |            |          |       |       |
|  17 |           CONNECT BY PUMP               |                          |       |       |       |            |          |       |       |
|  18 |           TABLE ACCESS BY INDEX ROWID   | T_*****_ORGA             |    10 |   180 |       |     7   (0)| 00:00:01 |       |       |
|* 19 |            INDEX RANGE SCAN             | IDX_*****_ORGA_PARENT_ID |    10 |       |       |     1   (0)| 00:00:01 |       |       |
|  20 |     VIEW                                |                          |    30M|    14G|       |  3425K  (2)| 01:21:43 |       |       |
|  21 |      HASH GROUP BY                      |                          |    30M|  5094M|  5452M|  3425K  (2)| 01:21:43 |       |       |
|* 22 |       HASH JOIN                         |                          |    30M|  5094M|       |  2242K  (2)| 00:53:29 |       |       |
|  23 |        TABLE ACCESS FULL                | T_--------               | 37788 |   332K|       |   860   (3)| 00:00:02 |       |       |
|* 24 |        HASH JOIN                        |                          |    29M|  4787M|   306M|  2240K  (2)| 00:53:27 |       |       |
|* 25 |         TABLE ACCESS FULL               | T_TERMINAL_*****_ORDER   |  8230K|   211M|       |   117K  (2)| 00:02:48 |       |       |
|  26 |         PARTITION RANGE ALL             |                          |    30M|  4173M|       |  1880K  (2)| 00:44:52 |     1 |    58 |
|* 27 |          TABLE ACCESS FULL              | T_---_LINE               |    30M|  4173M|       |  1880K  (2)| 00:44:52 |     1 |    58 |
|  28 |    HASH GROUP BY                        |                          |    29M|  6463M|  6891M|  4269K  (2)| 01:41:50 |       |       |
|* 29 |     HASH JOIN                           |                          |    29M|  6463M|       |  2785K  (2)| 01:06:26 |       |       |
|  30 |      TABLE ACCESS FULL                  | T_--------               | 37788 |   332K|       |   860   (3)| 00:00:02 |       |       |
|* 31 |      HASH JOIN RIGHT ANTI               |                          |    29M|  6143M|  6400K|  2783K  (2)| 01:06:24 |       |       |
|  32 |       VIEW                              | VW_SQ_1                  |   109K|  5119K|       |   285K  (2)| 00:06:50 |       |       |
|  33 |        MERGE JOIN                       |                          |   109K|  9172K|       |   285K  (2)| 00:06:50 |       |       |
|  34 |         SORT JOIN                       |                          |  4084K|   284M|       |   285K  (2)| 00:06:50 |       |       |
|  35 |          VIEW                           |                          |  4084K|   284M|       |   285K  (2)| 00:06:50 |       |       |
|  36 |           HASH GROUP BY                 |                          |  4084K|   494M|   602M|   285K  (2)| 00:06:50 |       |       |
|* 37 |            HASH JOIN                    |                          |  4084K|   494M|       |   168K  (2)| 00:04:01 |       |       |
|* 38 |             TABLE ACCESS FULL           | T_xxxx_OUT               |  9815 |   335K|       |   226   (2)| 00:00:01 |       |       |
|* 39 |             TABLE ACCESS FULL           | T_xxxx_OUT_LINE          |  4084K|   358M|       |   167K  (2)| 00:04:01 |       |       |
|* 40 |         SORT JOIN                       |                          |    10 |   130 |       |     8  (13)| 00:00:01 |       |       |
|  41 |          VIEW                           |                          |    10 |   130 |       |     7   (0)| 00:00:01 |       |       |
|* 42 |           FILTER                        |                          |       |       |       |            |          |       |       |
|* 43 |            CONNECT BY WITH FILTERING    |                          |       |       |       |            |          |       |       |
|* 44 |             TABLE ACCESS FULL           | T_*****_ORGA             |    36 |   972 |       |     8   (0)| 00:00:01 |       |       |
|  45 |             NESTED LOOPS                |                          |       |       |       |            |          |       |       |
|  46 |              CONNECT BY PUMP            |                          |       |       |       |            |          |       |       |
|  47 |              TABLE ACCESS BY INDEX ROWID| T_*****_ORGA             |    10 |   180 |       |     7   (0)| 00:00:01 |       |       |
|* 48 |               INDEX RANGE SCAN          | IDX_*****_ORGA_PARENT_ID |    10 |       |       |     1   (0)| 00:00:01 |       |       |
|* 49 |       HASH JOIN                         |                          |    29M|  4787M|   306M|  2240K  (2)| 00:53:27 |       |       |
|* 50 |        TABLE ACCESS FULL                | T_TERMINAL_*****_ORDER   |  8230K|   211M|       |   117K  (2)| 00:02:48 |       |       |
|  51 |        PARTITION RANGE ALL              |                          |    30M|  4173M|       |  1880K  (2)| 00:44:52 |     1 |    58 |
|* 52 |         TABLE ACCESS FULL               | T_---_LINE               |    30M|  4173M|       |  1880K  (2)| 00:44:52 |     1 |    58 |
--------------------------------------------------------------------------------------------------------------------------------------------

cbo把full join 转为了union all。30M 的行数,两次,坑啊。哥找了好大一会儿,找到了hint NATIVE_FULL_OUTER_JOIN,报着试试看的心情让网友加上 /*+ NATIVE_FULL_OUTER_JOIN */ 

新的plan如下:

-----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name                     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                          |    30M|    26G|       |  4397K  (2)| 01:44:54 |       |       |
|   1 |  VIEW                                | VW_FOJ_0                 |    30M|    26G|       |  4397K  (2)| 01:44:54 |       |       |
|*  2 |   HASH JOIN FULL OUTER               |                          |    30M|    26G|    50M|  4397K  (2)| 01:44:54 |       |       |
|   3 |    VIEW                              |                          |   109K|    49M|       |   285K  (2)| 00:06:50 |       |       |
|   4 |     MERGE JOIN                       |                          |   109K|    50M|       |   285K  (2)| 00:06:50 |       |       |
|   5 |      SORT JOIN                       |                          |  4084K|  1546M|       |   285K  (2)| 00:06:50 |       |       |
|   6 |       VIEW                           |                          |  4084K|  1546M|       |   285K  (2)| 00:06:50 |       |       |
|   7 |        HASH GROUP BY                 |                          |  4084K|   494M|   602M|   285K  (2)| 00:06:50 |       |       |
|*  8 |         HASH JOIN                    |                          |  4084K|   494M|       |   168K  (2)| 00:04:01 |       |       |
|*  9 |          TABLE ACCESS FULL           | T_xxxx_OUT               |  9815 |   335K|       |   226   (2)| 00:00:01 |       |       |
|* 10 |          TABLE ACCESS FULL           | T_xxxx_OUT_LINE          |  4084K|   358M|       |   167K  (2)| 00:04:01 |       |       |
|* 11 |      SORT JOIN                       |                          |    10 |   920 |       |     8  (13)| 00:00:01 |       |       |
|  12 |       VIEW                           |                          |    10 |   920 |       |     7   (0)| 00:00:01 |       |       |
|* 13 |        FILTER                        |                          |       |       |       |            |          |       |       |
|* 14 |         CONNECT BY WITH FILTERING    |                          |       |       |       |            |          |       |       |
|* 15 |          TABLE ACCESS FULL           | T_*****_ORGA             |    36 |   972 |       |     8   (0)| 00:00:01 |       |       |
|  16 |          NESTED LOOPS                |                          |       |       |       |            |          |       |       |
|  17 |           CONNECT BY PUMP            |                          |       |       |       |            |          |       |       |
|  18 |           TABLE ACCESS BY INDEX ROWID| T_*****_ORGA             |    10 |   180 |       |     7   (0)| 00:00:01 |       |       |
|* 19 |            INDEX RANGE SCAN          | IDX_*****_ORGA_PARENT_ID |    10 |       |       |     1   (0)| 00:00:01 |       |       |
|  20 |    VIEW                              |                          |    30M|    13G|       |  3425K  (2)| 01:21:43 |       |       |
|  21 |     HASH GROUP BY                    |                          |    30M|  5094M|  5452M|  3425K  (2)| 01:21:43 |       |       |
|* 22 |      HASH JOIN                       |                          |    30M|  5094M|       |  2242K  (2)| 00:53:29 |       |       |
|  23 |       TABLE ACCESS FULL              | T_--------               | 37788 |   332K|       |   860   (3)| 00:00:02 |       |       |
|* 24 |       HASH JOIN                      |                          |    29M|  4787M|   306M|  2240K  (2)| 00:53:27 |       |       |
|* 25 |        TABLE ACCESS FULL             | T_TERMINAL_*****_ORDER   |  8230K|   211M|       |   117K  (2)| 00:02:48 |       |       |
|  26 |        PARTITION RANGE ALL           |                          |    30M|  4173M|       |  1880K  (2)| 00:44:52 |     1 |    58 |
|* 27 |         TABLE ACCESS FULL            | T_---_LINE               |    30M|  4173M|       |  1880K  (2)| 00:44:52 |     1 |    58 |
-----------------------------------------------------------------------------------------------------------------------------------------

ok,让网友试运行了下,时间从25分钟降到了15分钟。

在群里提起时,棉花糖大师动作那叫一个快,马上给出一段

When you ask Oracle to use native full join implementation either with parameter _optimizer_native_full_outer_join equals to force (which is mentioned here as an enhancement of 10.2.0.4) or a hint NATIVE_FULL_OUTER_JOIN,

后面再优化,应该就是调pga了,那是后话不提


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值