复杂SQL 查询调优
nomic 2015-12-23 04:52:06 原本写好的SQL脚本是这样的:
SELECT /*+ PARALLEL (PR, 5)*/
PR.PURCH_REQ_ID,
PR.PURCH_REQ_ITM_NR,
PO.PO_NR,
PO.PO_ITM_NR,
PR.PURCH_REQ_ITM_SRC_SYS_KY,
PR.EFF_FRM_GMT_TS AS PREQ_EFF_FRM_GMT_TS,
PR.PURCH_REQ_CRT_TS,
PR.H_LGCL_DEL_IND AS PREQ_H_LGCL_DEL_IND,
PR.D_LGCL_DEL_IND AS PREQ_D_LGCL_DEL_IND,
PO.MFG_PTNR_SITE_ID,
PR.PROD_ID,
PR.PRE_DTF_CUST_CR_CHK_STAT_CD,
PR.PURCH_REQ_PART_STAT_CD,
PR.PLNT_CD,
PR.SO_ID,
PR.SO_LN_ITM_ID,
PR.SCH_LN_ITM_ID,
PR.PURCH_REQ_ITM_QT,
PO.SRC_SYS_KY AS PO_SRC_SYS_KY,
PO.EFF_FRM_GMT_TS AS PO_EFF_FRM_GMT_TS,
PO.PURCH_ORG_CD,
PO.PO_CRT_TS,
PO.PO_ITM_QT,
PO.PO_LN_ITM_DLVR_TX,
PO.H_LGCL_DEL_IND AS PO_H_LGCL_DEL_IND,
PO.D_LGCL_DEL_IND AS PO_D_LGCL_DEL_IND,
ACK_ASN_MAX.PO_ACK_ITM_EXT_DOC_ID,
ACK_ASN_MAX.PO_ACK_EFF_FRM_GMT_TS,
ACK_ASN_MAX.PACK_ID,
ACK_ASN_MAX.ADV_SHIP_NOTIF_ID,
ACK_ASN_MAX.PO_LA_CRT_DT ,
ACK_ASN_MAX.PO_LA_DT ,
ACK_ASN_MAX.PO_LA_QT ,
ACK_AB.PO_AB_CRT_DT ,
ACK_AB.PO_AB_DT ,
ACK_AB.PO_AB_QT ,
ACK_WI.PO_WI_CRT_DT ,
ACK_WI.PO_WI_DT ,
ACK_WI.PO_WI_QT
FROM
SCO.PURCH_REQ_LC_LE PR
JOIN
SCO.PO_LC_LE PO
ON
PR.PURCH_REQ_ID = PO.H_PURCH_REQ_ID
AND PR.PURCH_REQ_ITM_SRC_SYS_KY = PO.PURCH_REQ_ITM_SRC_SYS_KY
JOIN
(
SELECT /*+ PARALLEL (ASN, 5)*/
ACK_MAX.PO_NR,
ACK_MAX.PO_ITM_NR,
ACK_MAX.PO_ACK_ITM_EXT_DOC_ID,
ACK_MAX.EFF_FRM_GMT_TS AS PO_ACK_EFF_FRM_GMT_TS,
ACK_MAX.SRC_SYS_KY,
ASN.PACK_ID,
ASN.ADV_SHIP_NOTIF_ID,
TRUNC(ASN.ADV_SHIP_NOTIF_CRT_TS) AS PO_LA_CRT_DT,
TRUNC(ASN.ADV_SHIP_NOTIF_DLVR_TS) AS PO_LA_DT,
ASN.ADV_SHIP_NOTIF_ITM_QT AS PO_LA_QT
FROM
SCO.ADV_SHIP_NOTIF_LC_LE ASN
JOIN
(
SELECT
PO_NR,
PO_ITM_NR,
SRC_SYS_KY,
MAX(PO_ACK_ITM_EXT_DOC_ID) AS PO_ACK_ITM_EXT_DOC_ID,
EFF_FRM_GMT_TS
FROM
SCO.PO_ACK_LC_LE
WHERE
(
PO_NR, PO_ITM_NR, EFF_FRM_GMT_TS) IN
(
SELECT
PO_NR,
PO_ITM_NR,
MAX(EFF_FRM_GMT_TS)
FROM
SCO.PO_ACK_LC_LE
GROUP BY
PO_NR,
PO_ITM_NR)
GROUP BY PO_NR,
PO_ITM_NR,
SRC_SYS_KY,
EFF_FRM_GMT_TS) ACK_MAX
ON
ASN.PO_NR = ACK_MAX.PO_NR
AND ASN.PO_ITM_NR = ACK_MAX.PO_ITM_NR
AND ASN.SRC_SYS_KY = ACK_MAX.SRC_SYS_KY) ACK_ASN_MAX
ON
PO.PO_NR = ACK_ASN_MAX.PO_NR
AND PO.PO_ITM_NR = ACK_ASN_MAX.PO_ITM_NR
AND PO.SRC_SYS_KY = ACK_ASN_MAX.SRC_SYS_KY
JOIN
(
SELECT /*+ PARALLEL (ACK, 5)*/
ACK.PO_NR,
ACK.PO_ITM_NR,
SRC_SYS_KY,
TRUNC(ACK.PO_ACK_ITM_CRT_TS) AS PO_AB_CRT_DT,
TRUNC(ACK.PO_ACK_ITM_VNDR_CONF_TS) AS PO_AB_DT,
ACK.PO_ACK_ITM_QT AS PO_AB_QT
FROM
SCO.PO_ACK_LC_LE ACK
WHERE
ACK.PO_ACK_ITM_CONF_CATG_CD = 'AB') ACK_AB
ON
PO.PO_NR = ACK_AB.PO_NR
AND PO.PO_ITM_NR = ACK_AB.PO_ITM_NR
AND PO.SRC_SYS_KY = ACK_AB.SRC_SYS_KY
JOIN
(
SELECT /*+ PARALLEL (ACK, 5)*/
ACK.PO_NR,
ACK.PO_ITM_NR,
SRC_SYS_KY,
TRUNC(ACK.PO_ACK_ITM_CRT_TS) AS PO_WI_CRT_DT,
TRUNC(ACK.PO_ACK_ITM_VNDR_CONF_TS) AS PO_WI_DT,
ACK.PO_ACK_ITM_QT AS PO_WI_QT
FROM
SCO.PO_ACK_LC_LE ACK
WHERE
ACK.PO_ACK_ITM_CONF_CATG_CD = 'WI') ACK_WI
ON
PO.PO_NR = ACK_WI.PO_NR
AND PO.PO_ITM_NR = ACK_WI.PO_ITM_NR
AND PO.SRC_SYS_KY = ACK_WI.SRC_SYS_KY;
执行计划是这样的:
---------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8136 | 3456K| | 35106 (13)| 00:05:36 | | | |
| 1 | PX COORDINATOR | | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10001 | | | | | | Q1,01 | P->S | QC (RAND) |
| 3 | NESTED LOOPS | | | | | | | Q1,01 | PCWP | |
| 4 | NESTED LOOPS | | 8136 | 3456K| | 35106 (13)| 00:05:36 | Q1,01 | PCWP | |
| 5 | NESTED LOOPS | | 737 | 245K| | 34142 (14)| 00:05:27 | Q1,01 | PCWP | |
| 6 | NESTED LOOPS | | 347 | 99K| | 33945 (14)| 00:05:25 | Q1,01 | PCWP | |
| 7 | NESTED LOOPS | | 294 | 73206 | | 33778 (14)| 00:05:23 | Q1,01 | PCWP | |
|* 8 | HASH JOIN | | 510 | 73950 | | 33595 (14)| 00:05:21 | Q1,01 | PCWP | |
| 9 | BUFFER SORT | | | | | | | Q1,01 | PCWC | |
| 10 | PX RECEIVE | | 1676 | 127K| | 32966 (14)| 00:05:15 | Q1,01 | PCWP | |
| 11 | PX SEND BROADCAST | :TQ10000 | 1676 | 127K| | 32966 (14)| 00:05:15 | | S->P | BROADCAST |
| 12 | VIEW | | 1676 | 127K| | 32966 (14)| 00:05:15 | | | |
| 13 | HASH GROUP BY | | 1676 | 92180 | | 32966 (14)| 00:05:15 | | | |
| 14 | VIEW | VM_NWVW_2 | 1676 | 92180 | | 32966 (14)| 00:05:15 | | | |
|* 15 | FILTER | | | | | | | | | |
| 16 | HASH GROUP BY | | 1676 | 114K| | 32966 (14)| 00:05:15 | | | |
|* 17 | HASH JOIN | | 31M| 2104M| 505M| 29531 (4)| 00:04:43 | | | |
| 18 | INDEX FAST FULL SCAN| PO_ACK_LC_LE_XIE8 | 14M| 341M| | 2615 (6)| 00:00:25 | | | |
| 19 | INDEX FAST FULL SCAN| PO_ACK_LC_LE_XIE9 | 14M| 614M| | 3177 (5)| 00:00:31 | | | |
| 20 | PX BLOCK ITERATOR | | 3471K| 221M| | 622 (6)| 00:00:06 | Q1,01 | PCWC | |
| 21 | TABLE ACCESS FULL | ADV_SHIP_NOTIF_LC_LE | 3471K| 221M| | 622 (6)| 00:00:06 | Q1,01 | PCWP | |
| 22 | TABLE ACCESS BY INDEX ROWID | PO_LC_LE | 1 | 104 | | 2 (0)| 00:00:01 | Q1,01 | PCWP | |
|* 23 | INDEX UNIQUE SCAN | PO_LC_LE_XPK | 2 | | | 1 (0)| 00:00:01 | Q1,01 | PCWP | |
|* 24 | TABLE ACCESS BY INDEX ROWID | PO_ACK_LC_LE | 1 | 46 | | 3 (0)| 00:00:01 | Q1,01 | PCWP | |
|* 25 | INDEX RANGE SCAN | PO_ACK_LC_LE_XIE9 | 1 | | | 2 (0)| 00:00:01 | Q1,01 | PCWP | |
|* 26 | TABLE ACCESS BY INDEX ROWID | PO_ACK_LC_LE | 2 | 92 | | 3 (0)| 00:00:01 | Q1,01 | PCWP | |
|* 27 | INDEX RANGE SCAN | PO_ACK_LC_LE_XIE9 | 1 | | | 2 (0)| 00:00:01 | Q1,01 | PCWP | |
|* 28 | INDEX RANGE SCAN | PURCH_REQ_LC_LE_XIE8 | 15 | | | 2 (0)| 00:00:01 | Q1,01 | PCWP | |
| 29 | TABLE ACCESS BY INDEX ROWID | PURCH_REQ_LC_LE | 11 | 1034 | | 11 (0)| 00:00:01 | Q1,01 | PCWP | |
---------------------------------------------------------------------------------------------------------------------------------------------------
由于这些表的数量都非常大,需要进一步调优这个查询,请大家给点建议。
多谢