查询优化或调整

时间:2018-02-04 06:00:04

标签: sql oracle query-optimization

我对SQL很新,对我一直在研究的查询有点不了解。我需要优化下面的SQL查询。任何人都可以建议如何优化以下查询&它的效率。

WITH MAL_BAL AS
  (SELECT
    /*+parallel(2) */
    DATE,
    BPD,
    A.MNO,
    A.BRT,
    A.BRTD,
    BDR,
    B.CDNO,
    B.CGNO,
    B.BT_DR_AMT,
    B.BT_CR_AMT,
    B.BT_DR_NUM,
    B.BT_CR_NUM
  FROM ABC.POST A
  LEFT OUTER JOIN ABC.BALL B
  ON ( A.BRTD = B.BRTD
  AND A.BRT      = B.BRT)
  WHERE DATE  = TO_DATE ('20170131', 'YYYYMMDD')
  AND B.BRTD BETWEEN TRUNC (ADD_MONTHS (TO_DATE ('20170131', 'YYYYMMDD'), - 1),'MM') AND TO_DATE ('20170131', 'YYYYMMDD')
  AND BAT_DPST_TYP_CDE NOT IN ('S', 'V')
  AND B.PRCS_CENTRE_CDE     = 'NA'
  ),
  A_LKUP AS
  (SELECT
    /*+parallel(2)*/
    AA.DATE,
    AA.MNO,
    AA.CDNO,
    AA.CGNO,
    AA.DAC,
    AA.PAC,
    CTD_DB_AMT,
    CTD_CR_NUM,
    CTD_DB_NUM,
    CTD_CR_AMT,
    B.BRT,
    B.BRTD,
    CC.M_DC,
    CASE
      WHEN CC.M_DC IN ('E','P','A','I')
      THEN NVL (CC.NPT_DACE,AA.DAC)
    END AS DAC_LKP,
    CASE
      WHEN CC.M_DC IN ('E','P','A','I')
      THEN NVL (CC.NPT_INTCHG_AMT_AT_CDE,DD.PRD_AT_INTCHG_AMT)
    END AS INTCHG_AMT_LKP,
    CASE
      WHEN CC.M_DC IN ('E','P','A','I')
      THEN NVL (CC.NPT_ASSMNT_AT_CDE,DD.PRD_ASSMNT_AT_COD)
    END AS ASSMNT_AT_LKP,
    CASE
      WHEN CC.M_PC IN ('E','P','A','I')
      THEN NVL (CC.NPT_PACE, AA.PAC)
    END AS PAC_LKP,
    CASE
      WHEN CC.M_PC IN ('E','P','A','I')
      THEN NVL (CC.NPT_ASSMNT_PITM_AT_CDE, DD.PRD_ASSMNT_PITM_AT)
    END AS PITM_ASSMNT_AT_LKP,
    CASE
      WHEN CC.M_DC IN ('E', 'P', 'A', 'I')
      THEN NVL (CC.NPT_INTCHG_AMT_AT_CDE, DD.PRD_AT_INTCHG_AMT)
      ELSE AA.PRD_AT_INTCHG_AMT
    END INTCHG_AMT_APL_TYP_CDE,
    CASE
      WHEN CC.M_PC IN ('E', 'P', 'A', 'I')
      THEN NVL (CC.NPT_INTCHG_PCT_AT_CDE, DD.PRD_AT_INTCHG_PCT)
      ELSE AA.PRD_AT_INTCHG_PCT
    END AS INTCHG_PCT_APL_TYP_CDE,
    CASE
      WHEN CC.M_DC IN ('E', 'P', 'A', 'I')
      THEN NVL (CC.NPT_ASSMNT_AT_CDE, DD.PRD_ASSMNT_AT_COD)
      ELSE AA.PRD_ASM_DISC_AT_CDE
    END PRD_ASSMNT_AT_CDE,
    CASE
      WHEN CC.M_PC IN ('E', 'P', 'A', 'I')
      THEN NVL (CC.NPT_ASSMNT_PITM_AT_CDE,DD.PRD_ASSMNT_PITM_AT)
      ELSE AA.PRD_ASM_PITM_AT_CDE
    END AS PRD_ASSMNT_PITM_AT_CDE
  FROM MP.MALL AA
  INNER JOIN MAL_BAL B
  ON AA.DATE  = B.DATE
  AND AA.MNO     = B.MNO
  AND AA.BILL_TYP = 'MD'
  AND AA.CDNO     = B.CDNO
  AND AA.CGNO     = B.CGNO
  LEFT OUTER JOIN MP.M_T1 BB
  ON AA.MNO = BB.MNO
  LEFT OUTER JOIN MP.N_T1CC
  ON AA.CLG_NUM      = CC.CLG_CF_NUM
  AND AA.CDNO     = CC.CDNO
  AND AA.CGNO     = CC.CGNO
  AND BB.PMF_NPP_NUM = CC.NPP_NUM
  LEFT OUTER JOIN MP.P_T1 DD
  ON AA.CLNO  = DD.CLG_CF_NUM
  AND AA.CDNO = DD.CDNO
  AND AA.CGNO = DD.CGNO
  ),
  APL_CD AS
  (SELECT
    /*+parallel(2)*/
    DATE,
    MNO,
    CDNO,
    CGNO,
    BRT,
    BRTD,
    CASE
      WHEN M_DC NOT IN ('E','P','A','I')
      THEN DAC
      WHEN DAC_LKP = 'D'
      THEN (
        CASE
          WHEN CTD_DB_AMT = 0
          THEN (
            CASE
              WHEN DAC_LKP = INTCHG_AMT_LKP
              THEN ASSMNT_AT_LKP
              WHEN DAC_LKP <> INTCHG_AMT_LKP
              THEN INTCHG_AMT_LKP
            END)
          WHEN CTD_DB_AMT <> 0
          THEN (
            CASE
              WHEN DAC_LKP = INTCHG_AMT_LKP
              THEN DAC_LKP
              WHEN DAC_LKP <> INTCHG_AMT_LKP
              THEN INTCHG_AMT_LKP
            END)
        END)
      WHEN DAC_LKP = 'C'
      THEN (
        CASE
          WHEN CTD_CR_AMT = 0
          THEN (
            CASE
              WHEN DAC_LKP = INTCHG_AMT_LKP
              THEN ASSMNT_AT_LKP
              WHEN DAC_LKP <> INTCHG_AMT_LKP
              THEN INTCHG_AMT_LKP
            END)
          WHEN CTD_CR_AMT <> 0
          THEN (
            CASE
              WHEN DAC_LKP = INTCHG_AMT_LKP
              THEN DAC_LKP
              WHEN DAC_LKP <> INTCHG_AMT_LKP
              THEN INTCHG_AMT_LKP
            END)
        END)
      WHEN DAC_LKP NOT IN ('D', 'C')
      THEN DAC_LKP
    END 
    DAC,
    -- PITM APPLY TYPE CODE
    CASE
      WHEN M_DC NOT IN ('E','P','A','I')
      THEN PAC
      WHEN PAC_LKP = 'D'
      THEN (
        CASE
          WHEN CTD_DB_NUM = 0
          THEN (
            CASE
              WHEN PAC_LKP = INTCHG_AMT_LKP
              THEN PITM_ASSMNT_AT_LKP
              WHEN PAC_LKP <> INTCHG_AMT_LKP
              THEN INTCHG_AMT_LKP
            END)
          WHEN CTD_DB_NUM <> 0
          THEN (
            CASE
              WHEN PAC_LKP = INTCHG_AMT_LKP
              THEN PITM_ASSMNT_AT_LKP
              WHEN PAC_LKP <> INTCHG_AMT_LKP
              THEN INTCHG_AMT_LKP
            END)
        END)
      WHEN PAC_LKP = 'C'
      THEN (
        CASE
          WHEN CTD_CR_NUM = 0
          THEN (
            CASE
              WHEN PAC_LKP = INTCHG_AMT_LKP
              THEN ASSMNT_AT_LKP
              WHEN PAC_LKP <> INTCHG_AMT_LKP
              THEN INTCHG_AMT_LKP
            END)
          WHEN CTD_CR_NUM <> 0
          THEN (
            CASE
              WHEN PAC_LKP = INTCHG_AMT_LKP
              THEN PAC_LKP
              WHEN PAC_LKP <> INTCHG_AMT_LKP
              THEN INTCHG_AMT_LKP
            END)
        END)
      WHEN PAC_LKP NOT IN ('D', 'C')
      THEN PAC_LKP
    END 
    PAC,
    INTCHG_AMT_APL_TYP_CDE,
    INTCHG_PCT_APL_TYP_CDE,
    PRD_ASSMNT_AT_CDE,
    PRD_ASSMNT_PITM_AT_CDE
  FROM A_LKUP
  ),
  MAL_BAL_MALL AS
  (SELECT
    /*+parallel(2) */
    A.DATE,
    A.CLNO,
    A.CDNO,
    A.CGNO,
    A.MNO,
    B.BRT,
    B.BRTD,
    B.BDR,
    A.CPT_ID,
    A.CTD_DB_AMT,
    A.CTD_CR_AMT,
    A.CTD_DB_NUM,
    A.CTD_CR_NUM,
    TRUNC (
    CASE
      WHEN A.CTD_FEE_DSCNT_AMT = 0
      THEN 0
      WHEN A.CTD_FEE_DSCNT_AMT <> 0
      THEN (
        CASE
          WHEN C.DAC               = 'N'
          AND (A.CTD_DB_AMT - A.CTD_CR_AMT) = 0
          THEN 0
          WHEN C.DAC                = 'N'
          AND (A.CTD_DB_AMT             - A.CTD_CR_AMT) <> 0
          THEN ( ( B.BT_DR_AMT - B.BT_CR_AMT) / (A.CTD_DB_AMT - A.CTD_CR_AMT)) * A.CTD_FEE_DSCNT_AMT
          WHEN C.DAC               = 'G'
          AND (A.CTD_DB_AMT + A.CTD_CR_AMT) = 0
          THEN 0
          WHEN C.DAC                = 'G'
          AND (A.CTD_DB_AMT             + A.CTD_CR_AMT) <> 0
          THEN ( ( B.BT_DR_AMT + B.BT_CR_AMT) / (A.CTD_DB_AMT + A.CTD_CR_AMT)) * A.CTD_FEE_DSCNT_AMT
          WHEN C.DAC = 'C'
          AND A.CTD_CR_AMT    = 0
          THEN 0
          WHEN C.DAC = 'C'
          AND A.CTD_CR_AMT   <> 0
          THEN (B.BT_CR_AMT / A.CTD_CR_AMT) * A.CTD_FEE_DSCNT_AMT
          WHEN C.DAC = 'D'
          AND A.CTD_DB_AMT    = 0
          THEN 0
          WHEN C.DAC = 'D'
          AND A.CTD_DB_AMT   <> 0
          THEN (B.BT_DR_AMT / A.CTD_DB_AMT) * A.CTD_FEE_DSCNT_AMT
          ELSE 0
        END)
    END, 6) BAT_PRD_FEE_DSCNT_AMT,
    TRUNC (
    CASE
      WHEN A.CTD_FEE_PITM_AMT = 0
      THEN 0
      WHEN A.CTD_FEE_PITM_AMT <> 0
      THEN (
        CASE
          WHEN C.PAC                = 'N'
          AND (A.CTD_DB_NUM - A.CTD_CR_NUM) = 0
          THEN 0
          WHEN C.PAC                 = 'N'
          AND (A.CTD_DB_NUM             - A.CTD_CR_NUM) <> 0
          THEN ( ( B.BT_DR_NUM - B.BT_CR_NUM) / (A.CTD_DB_NUM - A.CTD_CR_NUM)) * A.CTD_FEE_PITM_AMT
          WHEN C.PAC                = 'G'
          AND (A.CTD_DB_NUM + A.CTD_CR_NUM) = 0
          THEN 0
          WHEN C.PAC                 = 'G'
          AND (A.CTD_DB_NUM             + A.CTD_CR_NUM) <> 0
          THEN ( ( B.BT_DR_NUM + B.BT_CR_NUM) / (A.CTD_DB_NUM + A.CTD_CR_NUM)) * A.CTD_FEE_PITM_AMT
          WHEN C.PAC = 'C'
          AND A.CTD_CR_NUM   = 0
          THEN 0
          WHEN C.PAC = 'C'
          AND A.CTD_CR_NUM  <> 0
          THEN (B.BT_CR_NUM / A.CTD_CR_NUM) * A.CTD_FEE_PITM_AMT
          WHEN C.PAC = 'D'
          AND A.CTD_DB_NUM   = 0
          THEN 0
          WHEN C.PAC = 'D'
          AND A.CTD_DB_NUM  <> 0
          THEN (B.BT_DR_NUM / A.CTD_DB_NUM) * A.CTD_FEE_PITM_AMT
          ELSE 0
        END)
    END, 6) BAT_PRD_FEE_PITM_AMT,
    TRUNC (
    CASE
      WHEN A.CTD_INTCHG_AMT = 0
      THEN 0
      WHEN A.CTD_INTCHG_AMT <> 0
      THEN (
        CASE
          WHEN C.INTCHG_AMT_APL_TYP_CDE     = 'N'
          AND (A.CTD_DB_AMT - A.CTD_CR_AMT) = 0
          THEN 0
          WHEN C.INTCHG_AMT_APL_TYP_CDE      = 'N'
          AND (A.CTD_DB_AMT             - A.CTD_CR_AMT) <> 0
          THEN ( ( B.BT_DR_AMT - B.BT_CR_AMT) / (A.CTD_DB_AMT - A.CTD_CR_AMT)) * A.CTD_INTCHG_AMT
          WHEN C.INTCHG_AMT_APL_TYP_CDE     = 'G'
          AND (A.CTD_DB_AMT + A.CTD_CR_AMT) = 0
          THEN 0
          WHEN C.INTCHG_AMT_APL_TYP_CDE      = 'G'
          AND (A.CTD_DB_AMT             + A.CTD_CR_AMT) <> 0
          THEN ( ( B.BT_DR_AMT + B.BT_CR_AMT) / (A.CTD_DB_AMT + A.CTD_CR_AMT)) * A.CTD_INTCHG_AMT
          WHEN C.INTCHG_AMT_APL_TYP_CDE = 'C'
          AND A.CTD_CR_AMT              = 0
          THEN 0
          WHEN C.INTCHG_AMT_APL_TYP_CDE = 'C'
          AND A.CTD_CR_AMT             <> 0
          THEN (B.BT_CR_AMT / A.CTD_CR_AMT) * A.CTD_INTCHG_AMT
          WHEN C.INTCHG_AMT_APL_TYP_CDE = 'D'
          AND A.CTD_DB_AMT              = 0
          THEN 0
          WHEN C.INTCHG_AMT_APL_TYP_CDE = 'D'
          AND A.CTD_DB_AMT             <> 0
          THEN (B.BT_DR_AMT / A.CTD_DB_AMT) * A.CTD_INTCHG_AMT
          ELSE 0
        END)
    END, 6) BAT_PRD_INTCHG_AMT,
    B.BT_DR_AMT,
    B.BT_CR_AMT,
    B.BT_DR_NUM,
    B.BT_CR_NUM,
    CTD_FEE_DSCNT_AMT,
    CTD_FEE_PITM_AMT,
    CTD_INTCHG_AMT,
    CTD_FEE_AMT,
    SUM (b.BT_DR_AMT) OVER (PARTITION BY a.MNO, a.CDNO, a.CGNO, a.CTD_DB_AMT, a.CTD_CR_AMT) AS S_BT_DR_AMT,
    SUM (b.BT_CR_AMT) OVER (PARTITION BY a.MNO, a.CDNO, a.CGNO, a.CTD_DB_AMT, a.CTD_CR_AMT) AS S_BT_CR_AMT,
    'N'                                                                                                        AS RCLS_FLG,
    C.DAC,
    C.PAC,
    C.INTCHG_AMT_APL_TYP_CDE,
    C.INTCHG_PCT_APL_TYP_CDE,
    C.PRD_ASSMNT_AT_CDE,
    C.PRD_ASSMNT_PITM_AT_CDE
  FROM MP.MALL A,
    MAL_BAL B,
    APL_CD C
  WHERE A.DATE = B.DATE
  AND A.MNO       = B.MNO
  AND A.CDNO       = B.CDNO
  AND A.CGNO       = B.CGNO
  AND B.DATE   = C.DATE(+)
  AND B.MNO       = C.MNO(+)
  AND B.CDNO       = C.CDNO(+)
  AND B.CGNO       = C.CGNO(+)
  AND B.BRT       = C.BRT(+)
  AND B.BRTD   = C.BRTD(+)
  AND A.BILL_TYP   = 'MD'
  AND A.CPT_ID NOT LIKE '%CF%'
  AND A.DATE = TO_DATE ('20170131', 'YYYYMMDD')
  AND A.CPT_ID NOT LIKE 'BTCH'
  )
  --AND A.CLNO NOT IN (5, 6)),

SELECT A.DATE,
  A.CDNO,
  A.CGNO,
  A.MNO,
  A.BRT,
  A.BRTD,
  A.BDR,
  A.CLNO,
  A.CPT_ID,
  A.DAC DACE,
  A.PAC DSCNT_PACE,
  A.INTCHG_PCT_APL_TYP_CDE,
  A.INTCHG_AMT_APL_TYP_CDE,
  A.PRD_ASSMNT_AT_CDE,
  A.PRD_ASSMNT_PITM_AT_CDE,
  A.BT_DR_AMT BP_DB_AMT,
  A.BT_CR_AMT BP_CR_AMT,
  A.BT_DR_NUM BP_DB_NUM,
  A.BT_CR_NUM BP_CR_NUM,
  A.BP_FEE_DSCNT_AMT,
  A.BP_FEE_PITM_AMT,
  A.BP_INTCHG_AMT,
  NVL (B.BP_FEE_ASSMNT_AMT, 0) BP_FEE_ASSMNT_AMT,
  NVL (B.BP_ASSMNT_PITM_AMT, 0) BP_ASSMNT_PITM_AMT,
  NVL (B.BP_ASSMNT_AMT, 0) BP_ASSMNT_AMT,
  NVL (B.CONVNCE_FEE, 0) CONVNCE_FEE,
  NVL (B.SURCHG_AMT, 0) SURCHG_AMT,
  NVL (B.PHRESIA_AMT, 0) PHRESIA_AMT,
  NVL (B.DCC_RBT_AMT, 0) DCC_RBT_AMT,
  A.RCLS_FLG RLCS_FLG
FROM MAL_BAL_MALL A
LEFT OUTER JOIN ABC.BBA B
ON A.DATE  = B.DATE
AND A.MNO     = B.MNO
AND A.CDNO     = B.CDNO
AND A.CGNO     = B.CGNO
AND A.BRT     = B.BRT
AND A.BRTD = B.BRTD
WHERE CTD_DB_AMT = S_BT_DR_AMT
AND CTD_CR_AMT   = S_BT_CR_AMT;

注意:BBA表有完整的访问计划(我正在处理它的索引),除此之外,如果需要任何其他更改,请告诉我。

执行计划

Plan hash value: 489280008

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                           | Name                        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                                    |                             |     1 |   437 |   643   (1)| 00:00:02 |       |       |        |      |            |
|   1 |  TEMP TABLE TRANSFORMATION                          |                             |       |       |            |          |       |       |        |      |            |
|   2 |   PX COORDINATOR                                    |                             |       |       |            |          |       |       |        |      |            |
|   3 |    PX SEND QC (RANDOM)                              | :TQ10000                    |       |       |            |          |       |       |  Q1,00 | P->S | QC (RAND)  |
|   4 |     LOAD AS SELECT                                  | SYS_TEMP_0FD9D9682_9E3FE5C2 |       |       |            |          |       |       |  Q1,00 | PCWP |            |
|   5 |      NESTED LOOPS                                   |                             |       |       |            |          |       |       |  Q1,00 | PCWP |            |
|   6 |       NESTED LOOPS                                  |                             |     1 |   111 |   633   (1)| 00:00:02 |       |       |  Q1,00 | PCWP |            |
|   7 |        PX BLOCK ITERATOR                            |                             |     1 |    65 |   631   (1)| 00:00:02 |     1 |     4 |  Q1,00 | PCWC |            |
|*  8 |         TABLE ACCESS STORAGE FULL                   | POST                        |     1 |    65 |   631   (1)| 00:00:02 |     1 |1048575|  Q1,00 | PCWP |            |
|   9 |        PARTITION RANGE AND                          |                             |     1 |       |     1   (0)| 00:00:01 |KEY(AP)|KEY(AP)|  Q1,00 | PCWP |            |
|* 10 |         INDEX RANGE SCAN                            | BALL_PK                     |     1 |       |     1   (0)| 00:00:01 |KEY(AP)|KEY(AP)|  Q1,00 | PCWP |            |
|  11 |       TABLE ACCESS BY LOCAL INDEX ROWID             | BALL                        |     1 |    46 |     2   (0)| 00:00:01 |     1 |     1 |  Q1,00 | PCWP |            |
|  12 |   PX COORDINATOR                                    |                             |       |       |            |          |       |       |        |      |            |
|  13 |    PX SEND QC (RANDOM)                              | :TQ20004                    |     1 |   437 |    11  (19)| 00:00:01 |       |       |  Q2,04 | P->S | QC (RAND)  |
|* 14 |     HASH JOIN OUTER                                 |                             |     1 |   437 |    11  (19)| 00:00:01 |       |       |  Q2,04 | PCWP |            |
|* 15 |      VIEW                                           |                             |     1 |   276 |     8  (13)| 00:00:01 |       |       |  Q2,04 | PCWP |            |
|  16 |       WINDOW SORT                                   |                             |     1 |   397 |     8  (13)| 00:00:01 |       |       |  Q2,04 | PCWP |            |
|  17 |        PX RECEIVE                                   |                             |     1 |   397 |     7   (0)| 00:00:01 |       |       |  Q2,04 | PCWP |            |
|  18 |         PX SEND HASH                                | :TQ20002                    |     1 |   397 |     7   (0)| 00:00:01 |       |       |  Q2,02 | P->P | HASH       |
|* 19 |          HASH JOIN OUTER BUFFERED                   |                             |     1 |   397 |     7   (0)| 00:00:01 |       |       |  Q2,02 | PCWP |            |
|  20 |           PX RECEIVE                                |                             |       |       |            |          |       |       |  Q2,02 | PCWP |            |
|  21 |            PX SEND HASH                             | :TQ20000                    |       |       |            |          |       |       |  Q2,00 | P->P | HASH       |
|  22 |             NESTED LOOPS                            |                             |       |       |            |          |       |       |  Q2,00 | PCWP |            |
|  23 |              NESTED LOOPS                           |                             |     1 |   303 |     3   (0)| 00:00:01 |       |       |  Q2,00 | PCWP |            |
|* 24 |               VIEW                                  |                             |     1 |   135 |     2   (0)| 00:00:01 |       |       |  Q2,00 | PCWP |            |
|  25 |                PX BLOCK ITERATOR                    |                             |     1 |    89 |     2   (0)| 00:00:01 |       |       |  Q2,00 | PCWC |            |
|  26 |                 TABLE ACCESS STORAGE FULL           | SYS_TEMP_0FD9D9682_9E3FE5C2 |     1 |    89 |     2   (0)| 00:00:01 |       |       |  Q2,00 | PCWP |            |
|  27 |               PARTITION RANGE SINGLE                |                             |     1 |       |     1   (0)| 00:00:01 |  2774 |  2774 |  Q2,00 | PCWP |            |
|* 28 |                INDEX UNIQUE SCAN                    | MALL_PK                     |     1 |       |     1   (0)| 00:00:01 |  2774 |  2774 |  Q2,00 | PCWP |            |
|* 29 |              TABLE ACCESS BY LOCAL INDEX ROWID      | MALL                        |     1 |   168 |     1   (0)| 00:00:01 |  2774 |  2774 |  Q2,00 | PCWP |            |
|  30 |           PX RECEIVE                                |                             |     1 |    94 |     4   (0)| 00:00:01 |       |       |  Q2,02 | PCWP |            |
|  31 |            PX SEND HASH                             | :TQ20001                    |     1 |    94 |     4   (0)| 00:00:01 |       |       |  Q2,01 | P->P | HASH       |
|  32 |             VIEW                                    |                             |     1 |    94 |     4   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  33 |              NESTED LOOPS OUTER                     |                             |     1 |   228 |     4   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  34 |               NESTED LOOPS OUTER                    |                             |     1 |   183 |     3   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  35 |                VIEW                                 |                             |     1 |   164 |     3   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  36 |                 NESTED LOOPS OUTER                  |                             |     1 |   217 |     3   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  37 |                  NESTED LOOPS                       |                             |     1 |   205 |     3   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|* 38 |                   VIEW                              |                             |     1 |    70 |     2   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  39 |                    PX BLOCK ITERATOR                |                             |     1 |    89 |     2   (0)| 00:00:01 |       |       |  Q2,01 | PCWC |            |
|  40 |                     TABLE ACCESS STORAGE FULL       | SYS_TEMP_0FD9D9682_9E3FE5C2 |     1 |    89 |     2   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  41 |                   PARTITION RANGE SINGLE            |                             |     1 |   135 |     1   (0)| 00:00:01 |  2774 |  2774 |  Q2,01 | PCWP |            |
|  42 |                    TABLE ACCESS BY LOCAL INDEX ROWID| MALL                        |     1 |   135 |     1   (0)| 00:00:01 |  2774 |  2774 |  Q2,01 | PCWP |            |
|* 43 |                     INDEX UNIQUE SCAN               | MALL_PK                     |     1 |       |     1   (0)| 00:00:01 |  2774 |  2774 |  Q2,01 | PCWP |            |
|  44 |                  TABLE ACCESS BY INDEX ROWID        | M_T1                        |     1 |    12 |     1   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|* 45 |                   INDEX UNIQUE SCAN                 | M_T1_PK                     |     1 |       |     1   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  46 |                TABLE ACCESS BY INDEX ROWID          | P_T1                        |     1 |    19 |     0   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|* 47 |                 INDEX UNIQUE SCAN                   | P_T1_PK                     |     1 |       |     0   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  48 |               TABLE ACCESS BY INDEX ROWID           | N_T1                        |     1 |    45 |     1   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|* 49 |                INDEX UNIQUE SCAN                    | N_PK                        |     1 |       |     1   (0)| 00:00:01 |       |       |  Q2,01 | PCWP |            |
|  50 |      BUFFER SORT                                    |                             |       |       |            |          |       |       |  Q2,04 | PCWC |            |
|  51 |       PX RECEIVE                                    |                             |     1 |   161 |     2   (0)| 00:00:01 |       |       |  Q2,04 | PCWP |            |
|  52 |        PX SEND BROADCAST                            | :TQ20003                    |     1 |   161 |     2   (0)| 00:00:01 |       |       |  Q2,03 | P->P | BROADCAST  |
|  53 |         PX BLOCK ITERATOR                           |                             |     1 |   161 |     2   (0)| 00:00:01 |       |       |  Q2,03 | PCWC |            |
|  54 |          TABLE ACCESS STORAGE FULL                  | BBA                         |     1 |   161 |     2   (0)| 00:00:01 |       |       |  Q2,03 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   8 - filter("A"."DATE"=TO_DATE(' 2017-01-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "A"."BRTD"<=TO_DATE(' 2017-01-31 00:00:00', 'syyyy-mm-dd 
              hh24:mi:ss') AND "A"."BAT_DPST_TYP_CDE"<>'S' AND "A"."BAT_DPST_TYP_CDE"<>'V' AND "A"."BRTD">=TO_DATE(' 2016-12-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
  10 - access("B"."PRCS_CENTRE_CDE"='NA' AND "A"."BRT"="B"."BRT" AND "A"."BRTD"="B"."BRTD")
       filter("B"."BRTD"<=TO_DATE(' 2017-01-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "B"."BRTD">=TO_DATE(' 2016-12-01 00:00:00', 'syyyy-mm-dd 
              hh24:mi:ss') AND "A"."BRTD"="B"."BRTD")
  14 - access("J"."BRTD"="B"."BRTD"(+) AND "J"."BRT"="B"."BRT"(+) AND "J"."CGNO"="B"."CGNO"(+) AND "J"."CDNO"="B"."CDNO"(+) AND 
              "J"."MRNO"="B"."MRNO"(+) AND "J"."DATE"="B"."DATE"(+))
  15 - filter("CTD_DB_AMT"="S_BT_DR_AMT" AND "CTD_CR_AMT"="S_BT_CR_AMT")
  19 - access("B"."DATE"="C"."DATE"(+) AND "B"."MRNO"="C"."MRNO"(+) AND "B"."CDNO"="C"."CDNO"(+) AND "B"."CGNO"="C"."CGNO"(+) AND 
              "B"."BRT"="C"."BRT"(+) AND "B"."BRTD"="C"."BRTD"(+))
  24 - filter("B"."DATE"=TO_DATE(' 2017-01-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
  28 - access("A"."DATE"=TO_DATE(' 2017-01-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "A"."BILL_TYP"='MD' AND "A"."CDNO"="B"."CDNO" AND 
              "A"."CGNO"="B"."CGNO" AND "A"."MRNO"="B"."MRNO")
  29 - filter("A"."CPT_ID" NOT LIKE '%CF%' AND "A"."CPT_ID"<>'BTCH')
  38 - filter("B"."DATE"=TO_DATE(' 2017-01-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
  43 - access("AA"."DATE"=TO_DATE(' 2017-01-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "AA"."BILL_TYP"='MD' AND "AA"."CDNO"="B"."CDNO" AND 
              "AA"."CGNO"="B"."CGNO" AND "AA"."MRNO"="B"."MRNO")
  45 - access("AA"."MRNO"="BB"."MRNO"(+))
  47 - access("from$_subquery$_008"."CLG_NUM"="DD"."CLG_CF_NUM"(+) AND "from$_subquery$_008"."QCSJ_C000000000600004"="DD"."CDNO"(+) AND 
              "from$_subquery$_008"."QCSJ_C000000000600006"="DD"."CGNO"(+))
  49 - access("AA"."CLNO"="CC"."CLG_CF_NUM"(+) AND "BB"."PMF_NPP_NUM"="CC"."NPP_NUM"(+) AND "AA"."CDNO"="CC"."CDNO"(+) AND "AA"."CGNO"="CC"."CGNO"(+))

Note
-----
   - dynamic sampling used for this statement (level=5)
   - Degree of Parallelism is 2 because of hint

1 个答案:

答案 0 :(得分:0)

对SQL查询进行故障排除的一个简单步骤是简单地删除所有 优化器提示(在您的情况下为PARALLEL)并重新运行查询以查看提示是否未导致 性能问题。

基本上,在不知道至少基本机制和含义的情况下,对单个查询进行故障排除的可能性非常有限。 执行计划的运作。

幸运的是,网络上有大量资源。

我建议用DBMS_SQLTUNE.REPORT_SQL_MONITOR

观察查询的执行情况

你会知道哪里,即在哪个操作中消耗数据库时间以及如何优化估计肉体 (通过实际行估计行的差异)。

为了解决问题,您也可以尝试简化查询(检查有多少行有其他人在SO 上发布的查询),以便提高性能 问题依然存在