首页 > 数据库 > Oracle > MERGE JOIN CARTESIAN
今天同事给我一个SQL,说很慢,让帮看一下。
打开执行计划一看, Id=31 有个 MERGE JOIN CARTESIAN 。
我问他是不是少写个关联条件? 他一看果然忘记写了,加上以后就好了。
SQL太长不写了, 只把执行计划贴出来。
Plan Hash Value :
------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9497371 | 3969901078 | 882603 | 02:56:32 |
| * 1 | INDEX RANGE SCAN | UX_MA_SORG_3 | 1 | 21 | 1 | 00:00:01 |
| * 2 | INDEX RANGE SCAN | UX_MA_SORG_3 | 1 | 21 | 1 | 00:00:01 |
| * 3 | INDEX RANGE SCAN | UX_MA_PROD_1 | 1 | 11 | 1 | 00:00:01 |
| 4 | SORT AGGREGATE | | 1 | 52 | | |
| 5 | VIEW | | 2 | 104 | 7 | 00:00:01 |
| 6 | SORT GROUP BY | | 2 | 112 | 7 | 00:00:01 |
| 7 | NESTED LOOPS | | | | | |
| 8 | NESTED LOOPS | | 2 | 112 | 6 | 00:00:01 |
| 9 | TABLE ACCESS BY INDEX ROWID | MA_MODL_ALFT | 2 | 56 | 4 | 00:00:01 |
| * 10 | INDEX RANGE SCAN | PK_MA_MODL_ALFT | 2 | | 2 | 00:00:01 |
| * 11 | INDEX UNIQUE SCAN | PK_MA_ALFT | 1 | | 0 | 00:00:01 |
| 12 | TABLE ACCESS BY INDEX ROWID | MA_ALFT | 1 | 28 | 1 | 00:00:01 |
| 13 | TABLE ACCESS BY INDEX ROWID | MA_MSG_LIST | 1 | 51 | 2 | 00:00:01 |
| * 14 | INDEX UNIQUE SCAN | PK_MA_MSG_LIST | 1 | | 1 | 00:00:01 |
| 15 | TABLE ACCESS BY INDEX ROWID | MA_MSG_LIST | 1 | 51 | 2 | 00:00:01 |
| * 16 | INDEX UNIQUE SCAN | PK_MA_MSG_LIST | 1 | | 1 | 00:00:01 |
| 17 | TABLE ACCESS BY INDEX ROWID | MA_MSG_LIST | 1 | 51 | 2 | 00:00:01 |
| * 18 | INDEX UNIQUE SCAN | PK_MA_MSG_LIST | 1 | | 1 | 00:00:01 |
| 19 | TABLE ACCESS BY INDEX ROWID | MA_MSG_LIST | 1 | 51 | 2 | 00:00:01 |
| * 20 | INDEX UNIQUE SCAN | PK_MA_MSG_LIST | 1 | | 1 | 00:00:01 |
| 21 | TABLE ACCESS BY INDEX ROWID | MA_MSG_LIST | 1 | 51 | 2 | 00:00:01 |
| * 22 | INDEX UNIQUE SCAN | PK_MA_MSG_LIST | 1 | | 1 | 00:00:01 |
| 23 | TABLE ACCESS BY INDEX ROWID | MA_MSG_LIST | 1 | 51 | 2 | 00:00:01 |
| * 24 | INDEX UNIQUE SCAN | PK_MA_MSG_LIST | 1 | | 1 | 00:00:01 |
| 25 | TABLE ACCESS BY INDEX ROWID | MA_MSG_LIST | 1 | 51 | 2 | 00:00:01 |
| * 26 | INDEX UNIQUE SCAN | PK_MA_MSG_LIST | 1 | | 1 | 00:00:01 |
| 27 | TABLE ACCESS BY INDEX ROWID | MA_MSG_LIST | 1 | 51 | 2 | 00:00:01 |
| * 28 | INDEX UNIQUE SCAN | PK_MA_MSG_LIST | 1 | | 1 | 00:00:01 |
| * 29 | INDEX RANGE SCAN | UX_CD_CODE_LIST_1 | 1 | 34 | 2 | 00:00:01 |
| 30 | SORT ORDER BY | | 9497371 | 3969901078 | 882603 | 02:56:32 |
| 31 | MERGE JOIN CARTESIAN | | 9497371 | 3969901078 | 38879 | 00:07:47 |
| 32 | NESTED LOOPS OUTER | | 343 | 136514 | 1418 | 00:00:18 |
| * 33 | HASH JOIN OUTER | | 343 | 113876 | 784 | 00:00:10 |
| * 34 | HASH JOIN RIGHT OUTER | | 343 | 106673 | 259 | 00:00:04 |
| 35 | TABLE ACCESS FULL | MA_CP_DC_PROD | 442 | 8398 | 3 | 00:00:01 |
| * 36 | HASH JOIN | | 343 | 100156 | 255 | 00:00:04 |
| * 37 | HASH JOIN | | 380 | 98420 | 171 | 00:00:03 |
| 38 | NESTED LOOPS | | 2 | 292 | 4 | 00:00:01 |
| 39 | TABLE ACCESS BY INDEX ROWID | MA_CP_CUST | 1 | 14 | 1 | 00:00:01 |
| * 40 | INDEX UNIQUE SCAN | PK_MA_CP_CUST | 1 | | 0 | 00:00:01 |
| * 41 | TABLE ACCESS FULL | MA_CP_DC | 2 | 264 | 3 | 00:00:01 |
| * 42 | TABLE ACCESS FULL | HI_CP_BAD_RTN | 26223 | 2963199 | 166 | 00:00:02 |
| 43 | TABLE ACCESS FULL | HI_CP_BAD_RTN_ST | 23447 | 773751 | 84 | 00:00:02 |
| 44 | INDEX FAST FULL SCAN | UX_MA_USER_1 | 305807 | 6421947 | 524 | 00:00:07 |
| * 45 | TABLE ACCESS BY INDEX ROWID | HI_ATCH_FILE_DETL | 1 | 66 | 3 | 00:00:01 |
| * 46 | INDEX RANGE SCAN | PK_HI_ATCH_FILE_DETL | 1 | | 2 | 00:00:01 |
| 47 | BUFFER SORT | | 27658 | 553160 | 882600 | 02:56:32 |
| 48 | TABLE ACCESS FULL | HI_CP_BAD_RTN_SBSC | 27658 | 553160 | 109 | 00:00:02 |
------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 1 - access("A"."SORG_ID"=CASE :B1 WHEN '10111152' THEN 'S900' WHEN '10113232' THEN 'S900' ELSE :B2 END AND "A"."SORG_TP"='BRNC')
* 2 - access("A"."SORG_ID"=:B1 AND "A"."SORG_TP"='OFFC')
* 3 - access("A"."PROD_CD"=:B1)
* 10 - access("A"."MODL_CD"=:B1)
* 11 - access("A"."ALFT_ID"="B"."ALFT_ID")
* 14 - access("A1"."LANG_CD"='CN' AND "A1"."MSG_ID"='CPFR_APPLY')
* 16 - access("A1"."LANG_CD"='CN' AND "A1"."MSG_ID"='CPFR_APPROVAL')
* 18 - access("A1"."LANG_CD"='CN' AND "A1"."MSG_ID"='CPFR_QUALITY')
* 20 - access("A1"."LANG_CD"='CN' AND "A1"."MSG_ID"='CPFR_TRANSPORT')
* 22 - access("A1"."LANG_CD"='CN' AND "A1"."MSG_ID"='CPFR_APPLY')
* 24 - access("A1"."LANG_CD"='CN' AND "A1"."MSG_ID"='CPFR_APPROVAL')
* 26 - access("A1"."LANG_CD"='CN' AND "A1"."MSG_ID"='CPFR_QUALITY')
* 28 - access("A1"."LANG_CD"='CN' AND "A1"."MSG_ID"='CPFR_TRANSPORT')
* 29 - access("A"."CODE_DIV"='CPFR_REJC_ST' AND "A"."LANG_CD"='CN' AND "A"."CODE_CD"=:B1)
* 33 - access("T1"."REGI_ID"="T6"."USER_ID"(+))
* 34 - access("T1"."CP_DC_ID"="T4"."CP_DC_ID"(+) AND "T1"."PROD_CD"="T4"."PROD_CD"(+))
* 36 - access("T1"."SERL_NO"="T10"."SERL_NO")
* 37 - access("T1"."CP_DC_ID"="T2"."CP_DC_ID")
* 40 - access("T3"."CP_CUST_ID"='CT1003')
* 41 - filter("T2"."CP_CUST_ID"='CT1003')
* 42 - filter("T1"."USGE_YN"='0001')
* 45 - filter("A"."USE_YN"(+)='Y')
* 46 - access("T1"."ATCH_FILE_SEQ"="A"."ATCH_FILE_SEQ"(+))
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13696961/viewspace-2079674/ ,如需转载,请注明出处,否则将追究法律责任。