Welcome 微信登录

首页 / 数据库 / MySQL / 一次400行SQL的优化过程

主要环境如下:SQL> select * from v$version;BANNER
-------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production4节点 HPUX RAC OLAP 环境SQL> show parameter db_block_sizeNAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------
db_block_size                        integer                           16384
SQL> show parameter db_fileNAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------
db_file_multiblock_read_count        integer ETL开发人员找我调查一个long running的JOB,该JOB已经跑了7小时了还没跑完。那个JOB 是一个insert into ... select ..... 语句。insert 肯定不会7小时还
未完成,所以,这里主要的调整应该关注 select 部分select部分的SQL语句如下,这是一个接近400行的SQL,大家不要头晕哈,可以直
接跳过这个SQL语句,看我下面的分析SELECT  ACTVY_SKID,
                      FUND_SKID,
                      PRMTN_SKID,
                      PROD_SKID,
                      DATE_SKID,
                      ACCT_SKID,
                      BUS_UNIT_SKID,
                      FY_DATE_SKID,
                      ESTMT_VAR_COST_AMT,
                      ESTMT_FIXED_COST_AMT,
                      REVSD_ESTMT_VAR_COST_AMT,
                      ACTL_VAR_COST_AMT,
                      ACTL_FIXED_COST_AMT,
                      COST_PLAN_AMT,
                      COST_CMMT_AMT,
                      COST_BOOK_AMT,
                      ESTMT_COST_OVRRD_AMT,
                      LA_TOT_BOOK_AMT,
                      MANUL_COST_OVRRD_AMT,
                      ACTL_COST_AMT
               FROM   (SELECT ACTVY_SKID,
       FUND_SKID,
       PROD_SKID,
       PRMTN_SKID,
       DATE_SKID,
       ACCT_SKID,
       BUS_UNIT_SKID,
       FY_DATE_SKID,
       ESTMT_VAR_COST_AMT,
       ESTMT_FIXED_COST_AMT,
       REVSD_ESTMT_VAR_COST_AMT,
       0 as ACTL_COST_AMT,
       ACTL_VAR_COST_AMT,
       ACTL_FIXED_COST_AMT,
       MANUL_COST_OVRRD_AMT,
       ESTMT_COST_OVRRD_AMT,
       COST_BOOK_AMT,
       -- Updated by Luke for QC3369
       -- If the committed amount on Activity level <0 then return 0
       (CASE
         WHEN SUM(ESTMT_COST_OVRRD_AMT - ACTL_VAR_COST_AMT -
                  ACTL_FIXED_COST_AMT) OVER(PARTITION BY ACTVY_SKID) < 0 THEN
          0
         ELSE
          COST_CMMT_AMT
       END) AS COST_CMMT_AMT,
       -- Updated by Luke for QC3369
       (CASE
         WHEN SUM(ESTMT_COST_OVRRD_AMT - ACTL_VAR_COST_AMT -
                  ACTL_FIXED_COST_AMT) OVER(PARTITION BY ACTVY_SKID) < 0 THEN
          0
         ELSE
          COST_PLAN_AMT
       END) AS COST_PLAN_AMT,
       LA_TOT_BOOK_AMT
  FROM (SELECT ACTVY_SKID,
               FUND_SKID,
               PROD_SKID,
               PRMTN_SKID,
               DATE_SKID,
               ACCT_SKID,
               BUS_UNIT_SKID,
               FY_DATE_SKID,
               ESTMT_VAR_COST_AMT,
               ESTMT_FIXED_COST_AMT,
               REVSD_ESTMT_VAR_COST_AMT,
               ACTL_VAR_COST_AMT,
               ACTL_FIXED_COST_AMT,
               MANUL_COST_OVRRD_AMT,
               (CASE
                 WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "E" THEN
                  ESTMT_FIXED_COST_AMT + ESTMT_VAR_COST_AMT
                 WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "R" THEN
                  ESTMT_FIXED_COST_AMT +
                  DECODE(REVSD_BPT_COST_AMT,
                         0,
                         REVSD_ESTMT_VAR_COST_AMT, --Ax Revised Estimated Variable Cost
                         REVSD_BPT_COST_AMT) --BPT Revised Cost
                 WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "M" THEN
                  MANUL_COST_OVRRD_AMT
                 WHEN ESTMT_COST_IND IS NULL THEN
                  DECODE(CORP_PRMTN_TYPE_CODE,
                         "Annual Agreement",
                         ESTMT_FIXED_COST_AMT +
                         DECODE(REVSD_BPT_COST_AMT,
                                0,
                                REVSD_ESTMT_VAR_COST_AMT, --Ax Revised Estimated Variable Cost
                                REVSD_BPT_COST_AMT), --BPT Revised Cost
                         ESTMT_FIXED_COST_AMT + ESTMT_VAR_COST_AMT)
               END) AS ESTMT_COST_OVRRD_AMT,
               (ACTL_VAR_COST_AMT + ACTL_FIXED_COST_AMT) AS COST_BOOK_AMT,
               DECODE(PRMTN_STTUS_CODE,
                      "Confirmed",
                      --Estimate Total Cost - Actual Cost
                      --Add the logic of Activity Stop date and Pyment allow IND
                      --For Defect 2913 Luke 2010-5-5
                      (CASE
                        WHEN (ACTVY_STOP_DATE IS NULL OR ACTVY_STOP_DATE > SYSDATE OR
                             NVL(PYMT_ALLWD_STOP_IND, "N") = "Y") THEN
                         (CASE
                        WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "E" THEN
                         ESTMT_FIXED_COST_AMT + ESTMT_VAR_COST_AMT
                        WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "R" THEN
                         ESTMT_FIXED_COST_AMT +
                         DECODE(REVSD_BPT_COST_AMT,
                                0,
                                REVSD_ESTMT_VAR_COST_AMT, --Ax Revised Estimated Variable Cost
                                REVSD_BPT_COST_AMT) --BPT Revised Cost
                        WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "M" THEN
                         MANUL_COST_OVRRD_AMT
                        WHEN ESTMT_COST_IND IS NULL THEN
                         DECODE(CORP_PRMTN_TYPE_CODE,
                                "Annual Agreement",
                                ESTMT_FIXED_COST_AMT +
                                DECODE(REVSD_BPT_COST_AMT,
                                       0,
                                       REVSD_ESTMT_VAR_COST_AMT, --Ax Revised Estimated Variable Cost
                                       REVSD_BPT_COST_AMT), --BPT Revised Cost
                                ESTMT_FIXED_COST_AMT + ESTMT_VAR_COST_AMT)
                      END) - (ACTL_VAR_COST_AMT + ACTL_FIXED_COST_AMT)
                       ELSE 0 END), 0) AS COST_CMMT_AMT,
               (CASE
                 WHEN (PRMTN_STTUS_CODE IN ("Planned", "Revised") AND
                      NVL(APPRV_STTUS_CODE, "Nothing") <> "Rejected" AND
                      --Add the logic of Activity Stop date and Pyment allow IND
                      --For Defect 2913 Luke 2010-5-5
                      (ACTVY_STOP_DATE IS NULL OR ACTVY_STOP_DATE > SYSDATE OR
                      NVL(PYMT_ALLWD_STOP_IND, "N") = "Y")) THEN
                  (CASE
                 WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "E" THEN
                  ESTMT_FIXED_COST_AMT + ESTMT_VAR_COST_AMT
                 WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "R" THEN
                  ESTMT_FIXED_COST_AMT +
                  DECODE(REVSD_BPT_COST_AMT,
                         0,
                         REVSD_ESTMT_VAR_COST_AMT, --Ax Revised Estimated Variable Cost
                         REVSD_BPT_COST_AMT) --BPT Revised Cost
                 WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "M" THEN
                  MANUL_COST_OVRRD_AMT
                 WHEN ESTMT_COST_IND IS NULL THEN
                  DECODE(CORP_PRMTN_TYPE_CODE,
                         "Annual Agreement",
                         ESTMT_FIXED_COST_AMT +
                         DECODE(REVSD_BPT_COST_AMT,
                                0,
                                REVSD_ESTMT_VAR_COST_AMT, --Ax Revised Estimated Variable Cost
                                REVSD_BPT_COST_AMT), --BPT Revised Cost
                         ESTMT_FIXED_COST_AMT + ESTMT_VAR_COST_AMT)
               END) - (ACTL_VAR_COST_AMT + ACTL_FIXED_COST_AMT) ELSE 0 END) AS COST_PLAN_AMT,
               (CASE
                 WHEN MTH_START_DATE > TRUNC(SYSDATE, "MM") AND
                      PRMTN_STTUS_CODE IN ("Planned", "Confirmed", "Revised") THEN
                  (CASE
                 WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "E" THEN
                  ESTMT_FIXED_COST_AMT + ESTMT_VAR_COST_AMT
                 WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "R" THEN
                  ESTMT_FIXED_COST_AMT +
                  DECODE(REVSD_BPT_COST_AMT,
                         0,
                         REVSD_ESTMT_VAR_COST_AMT, --Ax Revised Estimated Variable Cost
                         REVSD_BPT_COST_AMT) --BPT Revised Cost
                 WHEN SUBSTR(ESTMT_COST_IND, 1, 1) = "M" THEN
                  MANUL_COST_OVRRD_AMT
                 WHEN ESTMT_COST_IND IS NULL THEN
                  DECODE(CORP_PRMTN_TYPE_CODE,
                         "Annual Agreement",
                         ESTMT_FIXED_COST_AMT +
                         DECODE(REVSD_BPT_COST_AMT,
                                0,
                                REVSD_ESTMT_VAR_COST_AMT, --Ax Revised Estimated Variable Cost
                                REVSD_BPT_COST_AMT), --BPT Revised Cost
                         ESTMT_FIXED_COST_AMT + ESTMT_VAR_COST_AMT)
                   END)
               WHEN MTH_START_DATE <= TRUNC(SYSDATE, "MM") THEN
                  (ACTL_VAR_COST_AMT + ACTL_FIXED_COST_AMT)
               ELSE 0 END) AS LA_TOT_BOOK_AMT
          FROM (SELECT  ACTVY_MTH_GTIN.ACTVY_SKID,
                       ACTVY_MTH_GTIN.FUND_SKID,
                       ACTVY_MTH_GTIN.PROD_SKID,
                       ACTVY_MTH_GTIN.PRMTN_SKID,
                       ACTVY_MTH_GTIN.MTH_SKID AS DATE_SKID,
                       ACTVY_MTH_GTIN.ACCT_SKID,
                       ACTVY_MTH_GTIN.BUS_UNIT_SKID,
                       ACTVY_MTH_GTIN.FY_DATE_SKID,
                       PRMTN.PRMTN_STTUS_CODE,
                       PRMTN.APPRV_STTUS_CODE,
                       ACTVY.ESTMT_COST_IND,
                       ACTVY.CORP_PRMTN_TYPE_CODE,
                       ACTVY.ACTVY_STOP_DATE,
                       ACTVY.PYMT_ALLWD_STOP_IND,
                       CAL.MTH_START_DATE,
                       ROUND(NVL(DECODE(ACTVY.COST_TYPE_CODE,
                                        "% Fund",
                                        (ACTVY_MTH_GTIN.ESTMT_VAR_COST * -- added by Rita for defect 3105 in R10
                                        ACTVY_MTH_GTIN.ACTVY_GTIN_ESTMT_WGHT_RATE),
                                        DECODE(ACTVY.CORP_PRMTN_TYPE_CODE,
                                               "Annual Agreement",
                                               AA.ESTMT_VAR_COST_AMT,
                                               ESTMT_VAR_COST.ESTMT_VAR_COST_AMT)),
                                 0),
                             7) AS ESTMT_VAR_COST_AMT,
                       -- Modified by Simon For CR389 in R10 on 2010-3-18
                       ROUND(NVL(DECODE(ACTVY.COST_TYPE_CODE,
                                        -- % Fund
                                        "% Fund",
                                        ACTVY_MTH_GTIN.ESTMT_FIX_COST *
                                        ACTVY_MTH_GTIN.ACTVY_GTIN_ESTMT_WGHT_RATE,
                                        -- Fixed
                                        "Fixed",
                                        ACTVY_MTH_GTIN.ESTMT_FIX_COST *
                                        ACTVY_MTH_GTIN.ACTVY_GTIN_ESTMT_WGHT_RATE,
                                        -- Not % Fund or Fixed
                                        DECODE(DECODE(ACTVY.CORP_PRMTN_TYPE_CODE,
                                                      "Annual Agreement",
                                                      SUM(NVL(AA.ESTMT_VAR_COST_AMT,
                                                              0))
                                                      OVER(PARTITION BY
                                                           ACTVY_MTH_GTIN.ACTVY_SKID),
                                                      SUM(NVL(ESTMT_VAR_COST.ESTMT_VAR_COST_AMT,
                                                              0))
                                                      OVER(PARTITION BY
                                                           ACTVY_MTH_GTIN.ACTVY_SKID)),
                                               0,
                                               ACTVY_MTH_GTIN.ESTMT_FIX_COST *
                                               BRAND_MTH_RATE,
                                               ACTVY_MTH_GTIN.ESTMT_FIX_COST *
                                               NVL(DECODE(ACTVY.CORP_PRMTN_TYPE_CODE,
                                                          "Annual Agreement",
                                                          AA.ESTMT_VAR_COST_AMT,
                                                          ESTMT_VAR_COST.ESTMT_VAR_COST_AMT),
                                                   0) /
                                               DECODE(ACTVY.CORP_PRMTN_TYPE_CODE,
                                                      "Annual Agreement",
                                                      SUM(NVL(AA.ESTMT_VAR_COST_AMT,
                                                              0))
                                                      OVER(PARTITION BY
                                                           ACTVY_MTH_GTIN.ACTVY_SKID),
                                                      SUM(NVL(ESTMT_VAR_COST.ESTMT_VAR_COST_AMT,
                                                              0))
                                                      OVER(PARTITION BY
                                                           ACTVY_MTH_GTIN.ACTVY_SKID)))),
                                 0),
                             7) AS ESTMT_FIXED_COST_AMT,
                       -- Change in R10 for Revised Cost logic
                       ROUND(NVL(DECODE(ACTVY.CORP_PRMTN_TYPE_CODE,
                                        "Annual Agreement",
                                        AA.REVSD_ESTMT_VAR_COST_AMT,
                                        REVSD_VAR_COST.REVSD_ESTMT_VAR_COST_AMT),
                                 0),
                             7) AS REVSD_ESTMT_VAR_COST_AMT,
                       ROUND(NVL(ESTMT_VAR_COST.REVSD_BPT_COST_AMT, 0), 7) AS REVSD_BPT_COST_AMT,
                       ROUND(NVL((ACTVY_MTH_GTIN.ACTL_VAR_COST *
                                 ACTVY_MTH_GTIN.ACTVY_GTIN_ACTL_WGHT_RATE),
                                 0),
                             7) AS ACTL_VAR_COST_AMT,
                       ROUND(NVL((ACTVY_MTH_GTIN.ACTL_FIX_COST *
                                 ACTVY_MTH_GTIN.ACTVY_GTIN_ACTL_WGHT_RATE),
                                 0),
                             7) AS ACTL_FIXED_COST_AMT,
                       ROUND(NVL(DECODE(ACTVY.COST_TYPE_CODE,
                                        "% Fund",
                                        ACTVY_MTH_GTIN.MANUL_COST_OVRRD_AMT *
                                        ACTVY_MTH_GTIN.ACTVY_GTIN_ESTMT_WGHT_RATE,
                                        "Fixed",
                                        ACTVY_MTH_GTIN.MANUL_COST_OVRRD_AMT *
                                        ACTVY_MTH_GTIN.ACTVY_GTIN_ESTMT_WGHT_RATE,
                                        DECODE(DECODE(ACTVY.CORP_PRMTN_TYPE_CODE,
                                                      "Annual Agreement",
                                                      SUM(NVL(AA.ESTMT_VAR_COST_AMT,
                                                              0))
                                                      OVER(PARTITION BY
                                                           ACTVY_MTH_GTIN.ACTVY_SKID),
                                                      SUM(NVL(ESTMT_VAR_COST.ESTMT_VAR_COST_AMT,
                                                              0))
                                                      OVER(PARTITION BY
                                                           ACTVY_MTH_GTIN.ACTVY_SKID)),
                                               0,
                                               ACTVY_MTH_GTIN.MANUL_COST_OVRRD_AMT *
                                               BRAND_MTH_RATE,
                                               ACTVY_MTH_GTIN.MANUL_COST_OVRRD_AMT *
                                               NVL(DECODE(ACTVY.CORP_PRMTN_TYPE_CODE,
                                                          "Annual Agreement",
                                                          AA.ESTMT_VAR_COST_AMT,
                                                          ESTMT_VAR_COST.ESTMT_VAR_COST_AMT),
                                                   0) /
                                               DECODE(ACTVY.CORP_PRMTN_TYPE_CODE,
                                                      "Annual Agreement",
                                                      SUM(NVL(AA.ESTMT_VAR_COST_AMT,
                                                              0))
                                                      OVER(PARTITION BY
                                                           ACTVY_MTH_GTIN.ACTVY_SKID),
                                                      SUM(NVL(ESTMT_VAR_COST.ESTMT_VAR_COST_AMT,
                                                              0))
                                                      OVER(PARTITION BY
                                                           ACTVY_MTH_GTIN.ACTVY_SKID)))),
                                 0),
                             7) AS MANUL_COST_OVRRD_AMT
                  FROM OPT_ACTVY_DIM ACTVY,
                       OPT_PRMTN_DIM PRMTN,
                       OPT_CAL_MASTR_DIM CAL,
                       (SELECT ACTVY.ACTVY_SKID,
                               ACTVY_GTIN_BRAND.ACTVY_ID,
                               ACTVY.FUND_SKID,
                               ACTVY.ACCT_PRMTN_SKID AS ACCT_SKID,
                               ACTVY_GTIN_BRAND.PROD_SKID,
                               ACTVY_GTIN_BRAND.PROD_ID,
                               ACTVY_GTIN_BRAND.PRMTN_SKID,
                               ACTVY.BUS_UNIT_SKID,
                               ACTVY_GTIN_BRAND.MTH_SKID,
                               ACTVY_GTIN_BRAND.FY_DATE_SKID,
                               ACTVY.VAR_COST_ESTMT_AMT AS ESTMT_VAR_COST,
                               ACTVY.PRDCT_FIXED_COST_AMT AS ESTMT_FIX_COST,
                               ACTVY.CALC_INDEX_NUM AS ACTL_FIX_COST,
                               ACTVY.ACTL_VAR_COST_NUM AS ACTL_VAR_COST,
                               ACTVY.ESTMT_COST_OVRRD_AMT,
                               ACTVY.MANUL_COST_OVRRD_AMT,
                               ACTVY_GTIN_BRAND.ACTVY_GTIN_ACTL_WGHT_RATE,
                               ACTVY_GTIN_BRAND.ACTVY_GTIN_ESTMT_WGHT_RATE,
                 &n