• sql优化案例(优化逻辑,with改写)


    查询语句大量阻塞,event为latch:buffer cache chain(该语句属于热链)。
    查询结果跑不出来。
    
    explain plan for 
    SELECT K.IDX_CODE, NVL(AA.COUNT, 0) VALUE
      FROM K_AMR_CONFIG K
      LEFT JOIN (SELECT F.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT F.TG_ID) COUNT,
                        (SELECT C.IDX_CODE
                           FROM K_AMR_CONFIG C
                          WHERE C.TAG_NO = F.TAG_NO
                            AND C.TAG_TYPE = '02') IDX_CODE
                   FROM K_AMR_EXCEP_FLOW F,
                        (SELECT T.ORG_NO, T.TG_ID, A.AUTH_USER_NO
                           FROM K_ID_G_TG       T,
                                K_ID_GR_TG_RELA R,
                                K_ID_GRID_BUSS  B,
                                K_ID_STAFF      A
                          WHERE R.DATA_OPER_TYPE != 'D'
                            AND R.TG_ID = T.TG_ID
                            AND B.GR_ID = R.GR_ID
                            AND B.DATA_OPER_TYPE != 'D'
                            AND A.DATA_OPER_TYPE != 'D'
                            AND A.STAFF_NO <> '无'
                            AND A.STAFF_NO IS NOT NULL
                            AND B.BUSS_NO = A.STAFF_NO
                            AND A.AUTH_USER_NO IS NOT NULL
                            AND A.AUTH_USER_NO != '无') F1
                  WHERE F1.TG_ID = F.TG_ID
                    AND F1.ORG_NO = F.GDS_NO
                    AND F.TG_ID IS NOT NULL
                    AND F.GDS_NO IS NOT NULL
                    AND F.TAG_NO IN
                        ('TagPBGZ', 'TagPBZZ', 'TagPBYZBPH', 'TagPBDDY')
                    AND SUBSTR(REPLACE(FIRST_TIME, '-', ''), 1, 6) =
                        TO_CHAR(SYSDATE, 'yyyymm')
                    AND F1.AUTH_USER_NO = :B1
                  GROUP BY F1.AUTH_USER_NO, F.GDS_NO, F.TAG_NO
                 UNION ALL
                 SELECT FF.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT FF.TG_ID) COUNT,
                        'PD0009' IDX_CODE
                   FROM (SELECT F.GDS_NO, F.TG_ID
                           FROM K_AMR_GBTD_FLOW F
                          WHERE F.TG_ID IS NOT NULL
                            AND F.GDS_NO IS NOT NULL
                            AND F.TAG_NO = 'TagPBGZTD'
                            AND SUBSTR(REPLACE(MAKE_TIME, '-', ''), 1, 6) =
                                TO_CHAR(SYSDATE, 'yyyymm')
                          GROUP BY F.GDS_NO, F.TG_ID
                         HAVING COUNT(DISTINCT F.MSG_ID) >= 2) FF,
                        (SELECT T.ORG_NO, T.TG_ID, A.AUTH_USER_NO
                           FROM K_ID_G_TG       T,
                                K_ID_GR_TG_RELA R,
                                K_ID_GRID_BUSS  B,
                                K_ID_STAFF      A
                          WHERE R.DATA_OPER_TYPE != 'D'
                            AND R.TG_ID = T.TG_ID
                            AND B.GR_ID = R.GR_ID
                            AND B.DATA_OPER_TYPE != 'D'
                            AND A.DATA_OPER_TYPE != 'D'
                            AND B.BUSS_NO = A.STAFF_NO
                            AND A.STAFF_NO <> '无'
                            AND A.STAFF_NO IS NOT NULL
                            AND A.AUTH_USER_NO IS NOT NULL
                            AND A.AUTH_USER_NO != '无') F1
                  WHERE F1.TG_ID = FF.TG_ID
                    AND F1.ORG_NO = FF.GDS_NO
                    AND F1.AUTH_USER_NO = :B1
                  GROUP BY F1.AUTH_USER_NO, FF.GDS_NO
                 UNION ALL
                 SELECT FF.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT FF.DEVICE_NAME) COUNT,
                        'PD0012' IDX_CODE
                   FROM (SELECT F.GDS_NO,
                                F.TG_ID,
                                DEVICE_NAME,
                                COUNT(DISTINCT F.MSG_ID) CNT
                           FROM K_AMR_LBTZ_FLOW F
                          WHERE F.TG_ID IS NOT NULL
                            AND F.GDS_NO IS NOT NULL
                            AND F.TAG_NO = 'TagLBTZ'
                            AND SUBSTR(REPLACE(FIRST_TIME, '-', ''), 1, 6) =
                                TO_CHAR(SYSDATE, 'yyyymm')
                          GROUP BY F.GDS_NO, F.TG_ID, DEVICE_NAME
                         HAVING COUNT(DISTINCT F.MSG_ID) >= 3) FF,
                        (SELECT T.ORG_NO, T.TG_ID, A.AUTH_USER_NO
                           FROM K_ID_G_TG       T,
                                K_ID_GR_TG_RELA R,
                                K_ID_GRID_BUSS  B,
                                K_ID_STAFF      A
                          WHERE R.DATA_OPER_TYPE != 'D'
                            AND R.TG_ID = T.TG_ID
                            AND B.GR_ID = R.GR_ID
                            AND B.DATA_OPER_TYPE != 'D'
                            AND A.DATA_OPER_TYPE != 'D'
                            AND B.BUSS_NO = A.STAFF_NO
                            AND A.STAFF_NO <> '无'
                            AND A.STAFF_NO IS NOT NULL
                            AND A.AUTH_USER_NO IS NOT NULL
                            AND A.AUTH_USER_NO != '无') F1
                  WHERE F1.TG_ID = FF.TG_ID
                    AND F1.ORG_NO = FF.GDS_NO
                    AND F1.AUTH_USER_NO = :B1
                  GROUP BY F1.AUTH_USER_NO, FF.GDS_NO
                 UNION ALL
                 SELECT F.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT F.MSG_ID) COUNT,
                        'PD0013' IDX_CODE
                   FROM K_AMR_GBTD_FLOW F,
                        (SELECT T.ORG_NO, T.TG_ID, A.AUTH_USER_NO
                           FROM K_ID_G_TG       T,
                                K_ID_GR_TG_RELA R,
                                K_ID_GRID_BUSS  B,
                                K_ID_STAFF      A
                          WHERE R.DATA_OPER_TYPE != 'D'
                            AND R.TG_ID = T.TG_ID
                            AND B.GR_ID = R.GR_ID
                            AND B.DATA_OPER_TYPE != 'D'
                            AND A.DATA_OPER_TYPE != 'D'
                            AND B.BUSS_NO = A.STAFF_NO
                            AND A.STAFF_NO <> '无'
                            AND A.STAFF_NO IS NOT NULL
                            AND A.AUTH_USER_NO IS NOT NULL
                            AND A.AUTH_USER_NO != '无') F1
                  WHERE F1.TG_ID = F.TG_ID
                    AND F.TG_ID IS NOT NULL
                    AND F.GDS_NO IS NOT NULL
                    AND F.TAG_NO = 'TagZBBS'
                    AND SUBSTR(REPLACE(MAKE_TIME, '-', ''), 1, 6) =
                        TO_CHAR(SYSDATE, 'yyyymm')
                    AND F1.AUTH_USER_NO = :B1
                  GROUP BY F1.AUTH_USER_NO, F.GDS_NO
                 UNION ALL
                 SELECT FF.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT FF.DEVICE_NAME) COUNT,
                        'PD0014' IDX_CODE
                   FROM (SELECT F.GDS_NO,
                                F.TG_ID,
                                DEVICE_NAME,
                                COUNT(DISTINCT F.MSG_ID) CNT
                           FROM K_AMR_GBTD_FLOW F
                          WHERE F.TG_ID IS NOT NULL
                            AND F.GDS_NO IS NOT NULL
                            AND F.TAG_NO = 'TagZBBS'
                            AND SUBSTR(REPLACE(MAKE_TIME, '-', ''), 1, 6) =
                                TO_CHAR(SYSDATE, 'yyyymm')
                          GROUP BY F.GDS_NO, F.TG_ID, DEVICE_NAME
                         HAVING COUNT(DISTINCT F.MSG_ID) >= 2) FF,
                        (SELECT T.ORG_NO, T.TG_ID, A.AUTH_USER_NO
                           FROM K_ID_G_TG       T,
                                K_ID_GR_TG_RELA R,
                                K_ID_GRID_BUSS  B,
                                K_ID_STAFF      A
                          WHERE R.DATA_OPER_TYPE != 'D'
                            AND R.TG_ID = T.TG_ID
                            AND B.GR_ID = R.GR_ID
                            AND B.DATA_OPER_TYPE != 'D'
                            AND A.DATA_OPER_TYPE != 'D'
                            AND B.BUSS_NO = A.STAFF_NO
                            AND A.STAFF_NO <> '无'
                            AND A.STAFF_NO IS NOT NULL
                            AND A.AUTH_USER_NO IS NOT NULL
                            AND A.AUTH_USER_NO != '无') F1
                  WHERE F1.TG_ID = FF.TG_ID
                    AND F1.ORG_NO = FF.GDS_NO
                    AND F1.AUTH_USER_NO = :B1
                  GROUP BY F1.AUTH_USER_NO, FF.GDS_NO) AA
        ON AA.IDX_CODE = K.IDX_CODE
     WHERE K.IDX_CODE IN ('PD0002',
                          'PD0004',
                          'PD0006',
                          'PD0008',
                          'PD0009',
                          'PD0012',
                          'PD0013',
                          'PD0014');
    
    Plan hash value: 852542323
     
    -------------------------------------------------------------------------------------------------------------------
    | Id  | Operation                                 | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                          |                       |     8 |   256 | 84261   (1)| 00:16:52 |
    |*  1 |  HASH JOIN OUTER                          |                       |     8 |   256 | 84261   (1)| 00:16:52 |
    |   2 |   INLIST ITERATOR                         |                       |       |       |            |          |
    |*  3 |    INDEX RANGE SCAN                       | K_AMR_CONFIG_IDX_CODE |     8 |    56 |     1   (0)| 00:00:01 |
    |*  4 |   VIEW                                    |                       |     5 |   125 | 84260   (1)| 00:16:52 |
    |   5 |    UNION-ALL                              |                       |       |       |            |          |
    |*  6 |     TABLE ACCESS BY INDEX ROWID           | K_AMR_CONFIG          |     1 |    19 |     1   (0)| 00:00:01 |
    |*  7 |      INDEX RANGE SCAN                     | K_AMR_CONFIG_TAG_NO   |     2 |       |     1   (0)| 00:00:01 |
    |   8 |     SORT GROUP BY                         |                       |     1 |   132 |  4012   (1)| 00:00:49 |
    |   9 |      NESTED LOOPS                         |                       |     1 |   132 |  4011   (1)| 00:00:49 |
    |  10 |       NESTED LOOPS                        |                       |     9 |   132 |  4011   (1)| 00:00:49 |
    |* 11 |        HASH JOIN                          |                       |     1 |   121 |  4010   (1)| 00:00:49 |
    |  12 |         INLIST ITERATOR                   |                       |       |       |            |          |
    |* 13 |          TABLE ACCESS BY INDEX ROWID      | K_AMR_EXCEP_FLOW      |    28 |  1120 |   144   (0)| 00:00:02 |
    |* 14 |           INDEX RANGE SCAN                | IDX_TAG_NO            |  9897 |       |     7   (0)| 00:00:01 |
    |* 15 |         TABLE ACCESS BY INDEX ROWID       | K_IC_DIM_VALUE        |     1 |    37 |     1   (0)| 00:00:01 |
    |* 16 |          INDEX RANGE SCAN                 | IDX_K_IC_DIM_VALUE_N2 |     1 |       |     1   (0)| 00:00:01 |
    |  17 |         MERGE JOIN CARTESIAN              |                       | 60220 |  4763K|  3866   (1)| 00:00:47 |
    |  18 |          NESTED LOOPS                     |                       |     1 |    41 |     2   (0)| 00:00:01 |
    |  19 |           NESTED LOOPS                    |                       |     2 |    41 |     2   (0)| 00:00:01 |
    |* 20 |            TABLE ACCESS BY INDEX ROWID    | K_ID_STAFF            |     1 |    21 |     1   (0)| 00:00:01 |
    |* 21 |             INDEX RANGE SCAN              | IDX_K_ID_STAFF_N4     |     1 |       |     1   (0)| 00:00:01 |
    |* 22 |            INDEX RANGE SCAN               | IDX_BUSS_NO           |     2 |       |     1   (0)| 00:00:01 |
    |* 23 |           TABLE ACCESS BY INDEX ROWID     | K_ID_GRID_BUSS        |     1 |    20 |     1   (0)| 00:00:01 |
    |  24 |          BUFFER SORT                      |                       |   262K|    10M|  3865   (1)| 00:00:47 |
    |* 25 |           VIEW                            |                       |   262K|    10M|  3864   (1)| 00:00:47 |
    |* 26 |            FILTER                         |                       |       |       |            |          |
    |* 27 |             TABLE ACCESS FULL             | G_TG                  |   262K|  6146K|  3864   (1)| 00:00:47 |
    |* 28 |        INDEX RANGE SCAN                   | IDX_GR_TG_GR_ID       |     9 |       |     1   (0)| 00:00:01 |
    |* 29 |       TABLE ACCESS BY INDEX ROWID         | K_ID_GR_TG_RELA       |     1 |    11 |     1   (0)| 00:00:01 |
    |  30 |     HASH GROUP BY                         |                       |     1 |    31 | 62111   (1)| 00:12:26 |
    |  31 |      VIEW                                 | VM_NWVW_2             |     1 |    31 | 62110   (1)| 00:12:26 |
    |  32 |       HASH GROUP BY                       |                       |     1 |    97 | 62110   (1)| 00:12:26 |
    |  33 |        NESTED LOOPS                       |                       |     1 |    97 | 62109   (1)| 00:12:26 |
    |  34 |         NESTED LOOPS                      |                       |     9 |    97 | 62109   (1)| 00:12:26 |
    |* 35 |          HASH JOIN                        |                       |     1 |    86 | 62108   (1)| 00:12:26 |
    |  36 |           VIEW                            |                       |    47 |   235 | 58243   (1)| 00:11:39 |
    |* 37 |            FILTER                         |                       |       |       |            |          |
    |  38 |             HASH GROUP BY                 |                       |    47 |  6345 | 58243   (1)| 00:11:39 |
    |  39 |              VIEW                         | VM_NWVW_1             |   929 |   122K| 58243   (1)| 00:11:39 |
    |  40 |               HASH GROUP BY               |                       |   929 | 67817 | 58243   (1)| 00:11:39 |
    |* 41 |                TABLE ACCESS BY INDEX ROWID| K_AMR_GBTD_FLOW       |   929 | 67817 | 58242   (1)| 00:11:39 |
    |* 42 |                 INDEX RANGE SCAN          | IDX_TAG_NO1           |  5278K|       |  3107   (1)| 00:00:38 |
    |* 43 |           TABLE ACCESS BY INDEX ROWID     | K_IC_DIM_VALUE        |     1 |    37 |     1   (0)| 00:00:01 |
    |* 44 |            INDEX RANGE SCAN               | IDX_K_IC_DIM_VALUE_N2 |     1 |       |     1   (0)| 00:00:01 |
    |  45 |           MERGE JOIN CARTESIAN            |                       | 60220 |  4763K|  3865   (1)| 00:00:47 |
    |  46 |            NESTED LOOPS                   |                       |     1 |    41 |     2   (0)| 00:00:01 |
    |  47 |             NESTED LOOPS                  |                       |     2 |    41 |     2   (0)| 00:00:01 |
    |* 48 |              TABLE ACCESS BY INDEX ROWID  | K_ID_STAFF            |     1 |    21 |     1   (0)| 00:00:01 |
    |* 49 |               INDEX RANGE SCAN            | IDX_K_ID_STAFF_N4     |     1 |       |     1   (0)| 00:00:01 |
    |* 50 |              INDEX RANGE SCAN             | IDX_BUSS_NO           |     2 |       |     1   (0)| 00:00:01 |
    |* 51 |             TABLE ACCESS BY INDEX ROWID   | K_ID_GRID_BUSS        |     1 |    20 |     1   (0)| 00:00:01 |
    |  52 |            BUFFER SORT                    |                       |   262K|    10M|  3864   (1)| 00:00:47 |
    |* 53 |             VIEW                          |                       |   262K|    10M|  3863   (1)| 00:00:47 |
    |* 54 |              FILTER                       |                       |       |       |            |          |
    |* 55 |               TABLE ACCESS FULL           | G_TG                  |   262K|  6146K|  3863   (1)| 00:00:47 |
    |* 56 |          INDEX RANGE SCAN                 | IDX_GR_TG_GR_ID       |     9 |       |     1   (0)| 00:00:01 |
    |* 57 |         TABLE ACCESS BY INDEX ROWID       | K_ID_GR_TG_RELA       |     1 |    11 |     1   (0)| 00:00:01 |
    |  58 |     HASH GROUP BY                         |                       |     1 |   150 | 11901   (1)| 00:02:23 |
    |  59 |      VIEW                                 | VM_NWVW_4             |     1 |   150 | 11900   (1)| 00:02:23 |
    |  60 |       HASH GROUP BY                       |                       |     1 |   139 | 11900   (1)| 00:02:23 |
    |  61 |        NESTED LOOPS                       |                       |     1 |   139 | 11899   (1)| 00:02:23 |
    |  62 |         NESTED LOOPS                      |                       |     9 |   139 | 11899   (1)| 00:02:23 |
    |* 63 |          HASH JOIN                        |                       |     1 |   128 | 11898   (1)| 00:02:23 |
    |  64 |           VIEW                            |                       |   267 | 12549 |  8033   (1)| 00:01:37 |
    |* 65 |            FILTER                         |                       |       |       |            |          |
    |  66 |             HASH GROUP BY                 |                       |   267 | 47259 |  8033   (1)| 00:01:37 |
    |  67 |              VIEW                         | VM_NWVW_3             |  5333 |   921K|  8033   (1)| 00:01:37 |
    |  68 |               HASH GROUP BY               |                       |  5333 |   572K|  8033   (1)| 00:01:37 |
    |* 69 |                TABLE ACCESS FULL          | K_AMR_LBTZ_FLOW       |  5333 |   572K|  8032   (1)| 00:01:37 |
    |* 70 |           TABLE ACCESS BY INDEX ROWID     | K_IC_DIM_VALUE        |     1 |    37 |     1   (0)| 00:00:01 |
    |* 71 |            INDEX RANGE SCAN               | IDX_K_IC_DIM_VALUE_N2 |     1 |       |     1   (0)| 00:00:01 |
    |  72 |           MERGE JOIN CARTESIAN            |                       | 60220 |  4763K|  3865   (1)| 00:00:47 |
    |  73 |            NESTED LOOPS                   |                       |     1 |    41 |     2   (0)| 00:00:01 |
    |  74 |             NESTED LOOPS                  |                       |     2 |    41 |     2   (0)| 00:00:01 |
    |* 75 |              TABLE ACCESS BY INDEX ROWID  | K_ID_STAFF            |     1 |    21 |     1   (0)| 00:00:01 |
    |* 76 |               INDEX RANGE SCAN            | IDX_K_ID_STAFF_N4     |     1 |       |     1   (0)| 00:00:01 |
    |* 77 |              INDEX RANGE SCAN             | IDX_BUSS_NO           |     2 |       |     1   (0)| 00:00:01 |
    |* 78 |             TABLE ACCESS BY INDEX ROWID   | K_ID_GRID_BUSS        |     1 |    20 |     1   (0)| 00:00:01 |
    |  79 |            BUFFER SORT                    |                       |   262K|    10M|  3864   (1)| 00:00:47 |
    |* 80 |             VIEW                          |                       |   262K|    10M|  3863   (1)| 00:00:47 |
    |* 81 |              FILTER                       |                       |       |       |            |          |
    |* 82 |               TABLE ACCESS FULL           | G_TG                  |   262K|  6146K|  3863   (1)| 00:00:47 |
    |* 83 |          INDEX RANGE SCAN                 | IDX_GR_TG_GR_ID       |     9 |       |     1   (0)| 00:00:01 |
    |* 84 |         TABLE ACCESS BY INDEX ROWID       | K_ID_GR_TG_RELA       |     1 |    11 |     1   (0)| 00:00:01 |
    |  85 |     HASH GROUP BY                         |                       |     1 |   143 |  1187   (1)| 00:00:15 |
    |  86 |      VIEW                                 | VM_NWVW_5             |     1 |   143 |  1186   (1)| 00:00:15 |
    |  87 |       HASH GROUP BY                       |                       |     1 |   149 |  1186   (1)| 00:00:15 |
    |* 88 |        FILTER                             |                       |       |       |            |          |
    |* 89 |         FILTER                            |                       |       |       |            |          |
    |* 90 |          HASH JOIN                        |                       |     1 |   149 |  1184   (1)| 00:00:15 |
    |  91 |           NESTED LOOPS                    |                       |     1 |    76 |     4   (0)| 00:00:01 |
    |  92 |            NESTED LOOPS                   |                       |     1 |    76 |     4   (0)| 00:00:01 |
    |  93 |             NESTED LOOPS                  |                       |     1 |    52 |     3   (0)| 00:00:01 |
    |  94 |              NESTED LOOPS                 |                       |     1 |    41 |     2   (0)| 00:00:01 |
    |* 95 |               TABLE ACCESS BY INDEX ROWID | K_ID_STAFF            |     1 |    21 |     1   (0)| 00:00:01 |
    |* 96 |                INDEX RANGE SCAN           | IDX_K_ID_STAFF_N4     |     1 |       |     1   (0)| 00:00:01 |
    |* 97 |               TABLE ACCESS BY INDEX ROWID | K_ID_GRID_BUSS        |     1 |    20 |     1   (0)| 00:00:01 |
    |* 98 |                INDEX RANGE SCAN           | IDX_BUSS_NO           |     2 |       |     1   (0)| 00:00:01 |
    |* 99 |              TABLE ACCESS BY INDEX ROWID  | K_ID_GR_TG_RELA       |     1 |    11 |     1   (0)| 00:00:01 |
    |*100 |               INDEX RANGE SCAN            | IDX_GR_TG_GR_ID       |     9 |       |     1   (0)| 00:00:01 |
    |*101 |             INDEX RANGE SCAN              | IDX_G_TG_TG_ID        |     1 |       |     1   (0)| 00:00:01 |
    |*102 |            TABLE ACCESS BY INDEX ROWID    | G_TG                  |     1 |    24 |     1   (0)| 00:00:01 |
    |*103 |           TABLE ACCESS BY INDEX ROWID     | K_AMR_GBTD_FLOW       |    19 |  1387 |  1180   (1)| 00:00:15 |
    |*104 |            INDEX RANGE SCAN               | IDX_TAG_NO1           |   106K|       |    63   (0)| 00:00:01 |
    |*105 |         TABLE ACCESS BY INDEX ROWID       | K_IC_DIM_VALUE        |     1 |    37 |     1   (0)| 00:00:01 |
    |*106 |          INDEX RANGE SCAN                 | IDX_K_IC_DIM_VALUE_N2 |     1 |       |     1   (0)| 00:00:01 |
    | 107 |     HASH GROUP BY                         |                       |     1 |   143 |  5049   (1)| 00:01:01 |
    | 108 |      VIEW                                 | VM_NWVW_7             |     1 |   143 |  5048   (1)| 00:01:01 |
    | 109 |       HASH GROUP BY                       |                       |     1 |   131 |  5048   (1)| 00:01:01 |
    | 110 |        NESTED LOOPS                       |                       |     1 |   131 |  5047   (1)| 00:01:01 |
    | 111 |         NESTED LOOPS                      |                       |     9 |   131 |  5047   (1)| 00:01:01 |
    |*112 |          HASH JOIN                        |                       |     1 |   120 |  5046   (1)| 00:01:01 |
    | 113 |           VIEW                            |                       |     1 |    39 |  1181   (1)| 00:00:15 |
    |*114 |            FILTER                         |                       |       |       |            |          |
    | 115 |             HASH GROUP BY                 |                       |     1 |   169 |  1181   (1)| 00:00:15 |
    | 116 |              VIEW                         | VM_NWVW_6             |    19 |  3211 |  1181   (1)| 00:00:15 |
    | 117 |               HASH GROUP BY               |                       |    19 |  2033 |  1181   (1)| 00:00:15 |
    |*118 |                TABLE ACCESS BY INDEX ROWID| K_AMR_GBTD_FLOW       |    19 |  2033 |  1180   (1)| 00:00:15 |
    |*119 |                 INDEX RANGE SCAN          | IDX_TAG_NO1           |   106K|       |    63   (0)| 00:00:01 |
    |*120 |           TABLE ACCESS BY INDEX ROWID     | K_IC_DIM_VALUE        |     1 |    37 |     1   (0)| 00:00:01 |
    |*121 |            INDEX RANGE SCAN               | IDX_K_IC_DIM_VALUE_N2 |     1 |       |     1   (0)| 00:00:01 |
    | 122 |           MERGE JOIN CARTESIAN            |                       | 60220 |  4763K|  3865   (1)| 00:00:47 |
    | 123 |            NESTED LOOPS                   |                       |     1 |    41 |     2   (0)| 00:00:01 |
    | 124 |             NESTED LOOPS                  |                       |     2 |    41 |     2   (0)| 00:00:01 |
    |*125 |              TABLE ACCESS BY INDEX ROWID  | K_ID_STAFF            |     1 |    21 |     1   (0)| 00:00:01 |
    |*126 |               INDEX RANGE SCAN            | IDX_K_ID_STAFF_N4     |     1 |       |     1   (0)| 00:00:01 |
    |*127 |              INDEX RANGE SCAN             | IDX_BUSS_NO           |     2 |       |     1   (0)| 00:00:01 |
    |*128 |             TABLE ACCESS BY INDEX ROWID   | K_ID_GRID_BUSS        |     1 |    20 |     1   (0)| 00:00:01 |
    | 129 |            BUFFER SORT                    |                       |   262K|    10M|  3864   (1)| 00:00:47 |
    |*130 |             VIEW                          |                       |   262K|    10M|  3863   (1)| 00:00:47 |
    |*131 |              FILTER                       |                       |       |       |            |          |
    |*132 |               TABLE ACCESS FULL           | G_TG                  |   262K|  6146K|  3863   (1)| 00:00:47 |
    |*133 |          INDEX RANGE SCAN                 | IDX_GR_TG_GR_ID       |     9 |       |     1   (0)| 00:00:01 |
    |*134 |         TABLE ACCESS BY INDEX ROWID       | K_ID_GR_TG_RELA       |     1 |    11 |     1   (0)| 00:00:01 |
    -------------------------------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - access("AA"."IDX_CODE"(+)="K"."IDX_CODE")
       3 - access("K"."IDX_CODE"='PD0002' OR "K"."IDX_CODE"='PD0004' OR "K"."IDX_CODE"='PD0006' OR 
                  "K"."IDX_CODE"='PD0008' OR "K"."IDX_CODE"='PD0009' OR "K"."IDX_CODE"='PD0012' OR "K"."IDX_CODE"='PD0013' 
                  OR "K"."IDX_CODE"='PD0014')
       4 - filter("AA"."IDX_CODE"(+)='PD0002' OR "AA"."IDX_CODE"(+)='PD0004' OR "AA"."IDX_CODE"(+)='PD0006' OR 
                  "AA"."IDX_CODE"(+)='PD0008' OR "AA"."IDX_CODE"(+)='PD0009' OR "AA"."IDX_CODE"(+)='PD0012' OR 
                  "AA"."IDX_CODE"(+)='PD0013' OR "AA"."IDX_CODE"(+)='PD0014')
       6 - filter("C"."TAG_TYPE"='02')
       7 - access("C"."TAG_NO"=:B1)
      11 - access("TG_ID"=TO_NUMBER("F"."TG_ID") AND "ORG_NO"="F"."GDS_NO")
      13 - filter("F"."GDS_NO" IS NOT NULL AND "F"."TG_ID" IS NOT NULL AND 
                  SUBSTR(REPLACE("FIRST_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm'))
      14 - access("F"."TAG_NO"='TagPBDDY' OR "F"."TAG_NO"='TagPBGZ' OR "F"."TAG_NO"='TagPBYZBPH' OR 
                  "F"."TAG_NO"='TagPBZZ')
      15 - filter("DIM_CODE"='dept')
      16 - access("DIM_VALUE"=:B1)
      20 - filter("A"."STAFF_NO"<>'无' AND "A"."DATA_OPER_TYPE"<>'D' AND "A"."STAFF_NO" IS NOT NULL)
      21 - access("A"."AUTH_USER_NO"=:B1)
           filter("A"."AUTH_USER_NO"<>'无' AND "A"."AUTH_USER_NO" IS NOT NULL)
      22 - access("B"."BUSS_NO"="A"."STAFF_NO")
           filter("B"."BUSS_NO"<>'无')
      23 - filter("B"."DATA_OPER_TYPE"<>'D')
      25 - filter("ORG_NO" IS NOT NULL)
      26 - filter('无'<>:B1)
      27 - filter("A"."PUB_PRIV_FLAG"='01' AND "RUN_STATUS_CODE"='01')
      28 - access("B"."GR_ID"="R"."GR_ID")
           filter("R"."GR_ID" IS NOT NULL)
      29 - filter("R"."DATA_OPER_TYPE"<>'D' AND "R"."TG_ID"="TG_ID")
      35 - access("TG_ID"=TO_NUMBER("FF"."TG_ID") AND "ORG_NO"="FF"."GDS_NO")
      37 - filter(COUNT("$vm_col_1")>=2)
      41 - filter("F"."GDS_NO" IS NOT NULL AND "F"."TG_ID" IS NOT NULL AND 
                  SUBSTR(REPLACE("MAKE_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm'))
      42 - access("F"."TAG_NO"='TagPBGZTD')
      43 - filter("DIM_CODE"='dept')
      44 - access("DIM_VALUE"=:B1)
      48 - filter("A"."STAFF_NO"<>'无' AND "A"."DATA_OPER_TYPE"<>'D' AND "A"."STAFF_NO" IS NOT NULL)
      49 - access("A"."AUTH_USER_NO"=:B1)
           filter("A"."AUTH_USER_NO"<>'无' AND "A"."AUTH_USER_NO" IS NOT NULL)
      50 - access("B"."BUSS_NO"="A"."STAFF_NO")
           filter("B"."BUSS_NO"<>'无')
      51 - filter("B"."DATA_OPER_TYPE"<>'D')
      53 - filter("ORG_NO" IS NOT NULL)
      54 - filter('无'<>:B1)
      55 - filter("A"."PUB_PRIV_FLAG"='01' AND "RUN_STATUS_CODE"='01')
      56 - access("B"."GR_ID"="R"."GR_ID")
           filter("R"."GR_ID" IS NOT NULL)
      57 - filter("R"."DATA_OPER_TYPE"<>'D' AND "R"."TG_ID"="TG_ID")
      63 - access("TG_ID"=TO_NUMBER("FF"."TG_ID") AND "ORG_NO"="FF"."GDS_NO")
      65 - filter(COUNT("$vm_col_1")>=3)
      69 - filter("F"."GDS_NO" IS NOT NULL AND "F"."TG_ID" IS NOT NULL AND 
                  SUBSTR(REPLACE("FIRST_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm') AND "F"."TAG_NO"='TagLBTZ')
      70 - filter("DIM_CODE"='dept')
      71 - access("DIM_VALUE"=:B1)
      75 - filter("A"."STAFF_NO"<>'无' AND "A"."DATA_OPER_TYPE"<>'D' AND "A"."STAFF_NO" IS NOT NULL)
      76 - access("A"."AUTH_USER_NO"=:B1)
           filter("A"."AUTH_USER_NO"<>'无' AND "A"."AUTH_USER_NO" IS NOT NULL)
      77 - access("B"."BUSS_NO"="A"."STAFF_NO")
           filter("B"."BUSS_NO"<>'无')
      78 - filter("B"."DATA_OPER_TYPE"<>'D')
      80 - filter("ORG_NO" IS NOT NULL)
      81 - filter('无'<>:B1)
      82 - filter("A"."PUB_PRIV_FLAG"='01' AND "RUN_STATUS_CODE"='01')
      83 - access("B"."GR_ID"="R"."GR_ID")
           filter("R"."GR_ID" IS NOT NULL)
      84 - filter("R"."DATA_OPER_TYPE"<>'D' AND "R"."TG_ID"="TG_ID")
      88 - filter( (SELECT "P_DIM_ID" FROM CPSS."K_IC_DIM_VALUE" "K_IC_DIM_VALUE" WHERE "DIM_VALUE"=:B1 AND 
                  "DIM_CODE"='dept') IS NOT NULL)
      89 - filter('无'<>:B1)
      90 - access("TG_ID"=TO_NUMBER("F"."TG_ID"))
      95 - filter("A"."STAFF_NO"<>'无' AND "A"."DATA_OPER_TYPE"<>'D' AND "A"."STAFF_NO" IS NOT NULL)
      96 - access("A"."AUTH_USER_NO"=:B1)
           filter("A"."AUTH_USER_NO"<>'无' AND "A"."AUTH_USER_NO" IS NOT NULL)
      97 - filter("B"."DATA_OPER_TYPE"<>'D')
      98 - access("B"."BUSS_NO"="A"."STAFF_NO")
           filter("B"."BUSS_NO"<>'无')
      99 - filter("R"."DATA_OPER_TYPE"<>'D')
     100 - access("B"."GR_ID"="R"."GR_ID")
           filter("R"."GR_ID" IS NOT NULL)
     101 - access("R"."TG_ID"="TG_ID")
     102 - filter("A"."PUB_PRIV_FLAG"='01' AND "RUN_STATUS_CODE"='01')
     103 - filter("F"."GDS_NO" IS NOT NULL AND "F"."TG_ID" IS NOT NULL AND 
                  SUBSTR(REPLACE("MAKE_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm'))
     104 - access("F"."TAG_NO"='TagZBBS')
     105 - filter("DIM_CODE"='dept')
     106 - access("DIM_VALUE"=:B1)
     112 - access("TG_ID"=TO_NUMBER("FF"."TG_ID") AND "ORG_NO"="FF"."GDS_NO")
     114 - filter(COUNT("$vm_col_1")>=2)
     118 - filter("F"."GDS_NO" IS NOT NULL AND "F"."TG_ID" IS NOT NULL AND 
                  SUBSTR(REPLACE("MAKE_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm'))
     119 - access("F"."TAG_NO"='TagZBBS')
     120 - filter("DIM_CODE"='dept')
     121 - access("DIM_VALUE"=:B1)
     125 - filter("A"."STAFF_NO"<>'无' AND "A"."DATA_OPER_TYPE"<>'D' AND "A"."STAFF_NO" IS NOT NULL)
     126 - access("A"."AUTH_USER_NO"=:B1)
           filter("A"."AUTH_USER_NO"<>'无' AND "A"."AUTH_USER_NO" IS NOT NULL)
     127 - access("B"."BUSS_NO"="A"."STAFF_NO")
           filter("B"."BUSS_NO"<>'无')
     128 - filter("B"."DATA_OPER_TYPE"<>'D')
     130 - filter("ORG_NO" IS NOT NULL)
     131 - filter('无'<>:B1)
     132 - filter("A"."PUB_PRIV_FLAG"='01' AND "RUN_STATUS_CODE"='01')
     133 - access("B"."GR_ID"="R"."GR_ID")
           filter("R"."GR_ID" IS NOT NULL)
     134 - filter("R"."DATA_OPER_TYPE"<>'D' AND "R"."TG_ID"="TG_ID")
     
    仔细阅读sql我们发现该sql有一个重复出现的查询体
    (SELECT T.ORG_NO, T.TG_ID, A.AUTH_USER_NO
                           FROM K_ID_G_TG       T,
                                K_ID_GR_TG_RELA R,
                                K_ID_GRID_BUSS  B,
                                K_ID_STAFF      A
                          WHERE R.DATA_OPER_TYPE != 'D'
                            AND R.TG_ID = T.TG_ID
                            AND B.GR_ID = R.GR_ID
                            AND B.DATA_OPER_TYPE != 'D'
                            AND A.DATA_OPER_TYPE != 'D'
                            AND A.STAFF_NO <> '无'
                            AND A.STAFF_NO IS NOT NULL
                            AND B.BUSS_NO = A.STAFF_NO
                            AND A.AUTH_USER_NO IS NOT NULL
                            AND A.AUTH_USER_NO != '无') F1
    共出现了5次。
    对于这类重复出现的查询体,我们通常用with进行改写
    从执行计划看到访问G_TG表,才发现K_ID_G_TG表对应的是一个视图。
    
    create or replace view k_id_g_tg as
    select "TG_ID","ORG_NO","TG_NO","TG_NAME","TG_CAP","INST_ADDR","CHG_DATE","PUB_PRIV_FLAG","RUN_STATUS_CODE","REMARKS","AREA_TYPE","PF","IS_EXCE_TG","RATE_TIME","DWDM","DATA_TIME"
      from (select tg_id,
                   (select p_dim_id
                      from k_ic_dim_value
                     where dim_value = a.org_no
                       and dim_code = 'dept') org_no,
                   tg_no,
                   tg_name,
                   tg_cap,
                   inst_addr,
                   chg_date,
                   pub_priv_flag,
                   run_status_code,
                   remark remarks,
                   area_type,
                   pf,
                   (select is_exce_tg from k_id_g_tg_jp where tg_id=a.tg_id and rownum=1) is_exce_tg、,
                   (select rate_time from k_id_g_tg_jp where tg_id=a.tg_id and rownum=1) rate_time,
                   org_no  dwdm,
                   sysdate  data_time
              from g_tg a
             where a.pub_priv_flag = '01'
               and run_status_code = '01')
     where org_no is not null;
    查看视图,视图中出现的org_no、is_exce_tg、rate_time字段,我们根本用不上,查询基表足矣。
    所以with可以改写如下:
    with F1 as
    (
    SELECT T.ORG_NO, T.TG_ID, A.AUTH_USER_NO
                           FROM g_tg       T,
                                K_ID_GR_TG_RELA R,
                                K_ID_GRID_BUSS  B,
                                K_ID_STAFF      A
                          WHERE R.DATA_OPER_TYPE != 'D'
                            AND R.TG_ID = T.TG_ID
                            AND B.GR_ID = R.GR_ID
                            AND B.DATA_OPER_TYPE != 'D'
                            AND A.DATA_OPER_TYPE != 'D'
                            AND A.STAFF_NO <> '无'
                            AND A.STAFF_NO IS NOT NULL
                            AND B.BUSS_NO = A.STAFF_NO
                            AND A.AUTH_USER_NO IS NOT NULL
                            AND A.AUTH_USER_NO != '无'
                            AND A.AUTH_USER_NO = 'P6xxxxxxx1'
                            AND T.pub_priv_flag = '01'
                            and T.run_status_code = '01'
    )
    SELECT K.IDX_CODE, NVL(AA.COUNT, 0) VALUE
      FROM K_AMR_CONFIG K
      LEFT JOIN  (
                 SELECT F.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT F.TG_ID) COUNT,
                        (SELECT C.IDX_CODE
                           FROM K_AMR_CONFIG C
                          WHERE C.TAG_NO = F.TAG_NO
                            AND C.TAG_TYPE = '02') IDX_CODE
                   FROM K_AMR_EXCEP_FLOW F,
                         F1
                  WHERE F1.TG_ID = F.TG_ID
                    AND F1.ORG_NO = F.GDS_NO
                    AND F.TG_ID IS NOT NULL
                    AND F.GDS_NO IS NOT NULL
                    AND F.TAG_NO IN
                        ('TagPBGZ', 'TagPBZZ', 'TagPBYZBPH', 'TagPBDDY')
                    AND SUBSTR(REPLACE(FIRST_TIME, '-', ''), 1, 6) =
                        TO_CHAR(SYSDATE, 'yyyymm')
                  GROUP BY F1.AUTH_USER_NO, F.GDS_NO, F.TAG_NO
                 UNION ALL
                 SELECT FF.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT FF.TG_ID) COUNT,
                        'PD0009' IDX_CODE
                   FROM (SELECT F.GDS_NO, F.TG_ID
                           FROM K_AMR_GBTD_FLOW F
                          WHERE F.TG_ID IS NOT NULL
                            AND F.GDS_NO IS NOT NULL
                            AND F.TAG_NO = 'TagPBGZTD'
                            AND SUBSTR(REPLACE(MAKE_TIME, '-', ''), 1, 6) =
                                TO_CHAR(SYSDATE, 'yyyymm')
                          GROUP BY F.GDS_NO, F.TG_ID
                         HAVING COUNT(DISTINCT F.MSG_ID) >= 2) FF,
                         F1
                  WHERE F1.TG_ID = FF.TG_ID
                    AND F1.ORG_NO = FF.GDS_NO
                  GROUP BY F1.AUTH_USER_NO, FF.GDS_NO
                 UNION ALL
                 SELECT FF.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT FF.DEVICE_NAME) COUNT,
                        'PD0012' IDX_CODE
                   FROM (SELECT F.GDS_NO,
                                F.TG_ID,
                                DEVICE_NAME,
                                COUNT(DISTINCT F.MSG_ID) CNT
                           FROM K_AMR_LBTZ_FLOW F
                          WHERE F.TG_ID IS NOT NULL
                            AND F.GDS_NO IS NOT NULL
                            AND F.TAG_NO = 'TagLBTZ'
                            AND SUBSTR(REPLACE(FIRST_TIME, '-', ''), 1, 6) =
                                TO_CHAR(SYSDATE, 'yyyymm')
                          GROUP BY F.GDS_NO, F.TG_ID, DEVICE_NAME
                         HAVING COUNT(DISTINCT F.MSG_ID) >= 3) FF,
                         F1
                  WHERE F1.TG_ID = FF.TG_ID
                    AND F1.ORG_NO = FF.GDS_NO
                  GROUP BY F1.AUTH_USER_NO, FF.GDS_NO
                 UNION ALL
                 SELECT F.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT F.MSG_ID) COUNT,
                        'PD0013' IDX_CODE
                   FROM K_AMR_GBTD_FLOW F,
                         F1
                  WHERE F1.TG_ID = F.TG_ID
                    AND F.TG_ID IS NOT NULL
                    AND F.GDS_NO IS NOT NULL
                    AND F.TAG_NO = 'TagZBBS'
                    AND SUBSTR(REPLACE(MAKE_TIME, '-', ''), 1, 6) =
                        TO_CHAR(SYSDATE, 'yyyymm')
                  GROUP BY F1.AUTH_USER_NO, F.GDS_NO
                 UNION ALL
                 SELECT FF.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT FF.DEVICE_NAME) COUNT,
                        'PD0014' IDX_CODE
                   FROM (SELECT F.GDS_NO,
                                F.TG_ID,
                                DEVICE_NAME,
                                COUNT(DISTINCT F.MSG_ID) CNT
                           FROM K_AMR_GBTD_FLOW F
                          WHERE F.TG_ID IS NOT NULL
                            AND F.GDS_NO IS NOT NULL
                            AND F.TAG_NO = 'TagZBBS'
                            AND SUBSTR(REPLACE(MAKE_TIME, '-', ''), 1, 6) =
                                TO_CHAR(SYSDATE, 'yyyymm')
                          GROUP BY F.GDS_NO, F.TG_ID, DEVICE_NAME
                         HAVING COUNT(DISTINCT F.MSG_ID) >= 2) FF,
                         F1
                  WHERE F1.TG_ID = FF.TG_ID
                    AND F1.ORG_NO = FF.GDS_NO
                  GROUP BY F1.AUTH_USER_NO, FF.GDS_NO
                  
                  ) AA
        ON AA.IDX_CODE = K.IDX_CODE
     WHERE K.IDX_CODE IN ('PD0002',
                          'PD0004',
                          'PD0006',
                          'PD0008',
                          'PD0009',
                          'PD0012',
                          'PD0013',
                          'PD0014');
    再次执行查询,还是查不动。
    我们分别对union all上下关联的sql进行分析
    SELECT FF.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT FF.TG_ID) COUNT,
                        'PD0009' IDX_CODE
                   FROM (SELECT F.GDS_NO, F.TG_ID
                           FROM K_AMR_GBTD_FLOW F
                          WHERE F.TG_ID IS NOT NULL
                            AND F.GDS_NO IS NOT NULL
                            AND F.TAG_NO = 'TagPBGZTD'
                            AND SUBSTR(REPLACE(MAKE_TIME, '-', ''), 1, 6) =
                                TO_CHAR(SYSDATE, 'yyyymm')
                          GROUP BY F.GDS_NO, F.TG_ID
                         HAVING COUNT(DISTINCT F.MSG_ID) >= 2) FF,
                         F1
                  WHERE F1.TG_ID = FF.TG_ID
                    AND F1.ORG_NO = FF.GDS_NO
                  GROUP BY F1.AUTH_USER_NO, FF.GDS_NO
    该步骤执行慢。
    从执行计划中看出,走的是TAG_NO的索引。
    通过dba_tab_col_statistics发现TAG_NO distinct值为2。
    全表数据量约为500w。
    分析其他过滤条件MAKE_TIME列,数据比较倾斜,201910月数据为200w,其他月份数据量偏少,最高只有10w左右。
    所以删除了原先TAG_NO列索引 drop index cpss.IDX_TAG_NO1;
    创建函数索引
    create index cpss.idx_MAKE_TIME on cpss.K_AMR_GBTD_FLOW(substr(replace(MAKE_TIME, '-', ''), 1, 6),TAG_NO);
    执行计划如下:
            
    Plan hash value: 668798141
     
    ------------------------------------------------------------------------------------------------------------------------
    | Id  | Operation                                | Name                        | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                         |                             |     8 |   256 |  9039   (1)| 00:01:49 |
    |   1 |  TEMP TABLE TRANSFORMATION               |                             |       |       |            |          |
    |   2 |   LOAD AS SELECT                         | SYS_TEMP_0FD9FD2FB_8ABCBB03 |       |       |            |          |
    |   3 |    NESTED LOOPS                          |                             |     1 |    76 |     4   (0)| 00:00:01 |
    |   4 |     NESTED LOOPS                         |                             |     1 |    76 |     4   (0)| 00:00:01 |
    |   5 |      NESTED LOOPS                        |                             |     1 |    52 |     3   (0)| 00:00:01 |
    |   6 |       NESTED LOOPS                       |                             |     1 |    41 |     2   (0)| 00:00:01 |
    |*  7 |        TABLE ACCESS BY INDEX ROWID       | K_ID_STAFF                  |     1 |    21 |     1   (0)| 00:00:01 |
    |*  8 |         INDEX RANGE SCAN                 | IDX_K_ID_STAFF_N4           |     1 |       |     1   (0)| 00:00:01 |
    |*  9 |        TABLE ACCESS BY INDEX ROWID       | K_ID_GRID_BUSS              |     1 |    20 |     1   (0)| 00:00:01 |
    |* 10 |         INDEX RANGE SCAN                 | IDX_BUSS_NO                 |     2 |       |     1   (0)| 00:00:01 |
    |* 11 |       TABLE ACCESS BY INDEX ROWID        | K_ID_GR_TG_RELA             |     1 |    11 |     1   (0)| 00:00:01 |
    |* 12 |        INDEX RANGE SCAN                  | IDX_GR_TG_GR_ID             |     9 |       |     1   (0)| 00:00:01 |
    |* 13 |      INDEX RANGE SCAN                    | IDX_G_TG_TG_ID              |     1 |       |     1   (0)| 00:00:01 |
    |* 14 |     TABLE ACCESS BY INDEX ROWID          | G_TG                        |     1 |    24 |     1   (0)| 00:00:01 |
    |* 15 |   HASH JOIN OUTER                        |                             |     8 |   256 |  9035   (1)| 00:01:49 |
    |  16 |    INLIST ITERATOR                       |                             |       |       |            |          |
    |* 17 |     INDEX RANGE SCAN                     | K_AMR_CONFIG_IDX_CODE       |     8 |    56 |     1   (0)| 00:00:01 |
    |* 18 |    VIEW                                  |                             |     5 |   125 |  9034   (1)| 00:01:49 |
    |  19 |     UNION-ALL                            |                             |       |       |            |          |
    |* 20 |      TABLE ACCESS BY INDEX ROWID         | K_AMR_CONFIG                |     1 |    19 |     1   (0)| 00:00:01 |
    |* 21 |       INDEX RANGE SCAN                   | K_AMR_CONFIG_TAG_NO         |     2 |       |     1   (0)| 00:00:01 |
    |  22 |      SORT GROUP BY                       |                             |     1 |    68 |     4  (25)| 00:00:01 |
    |  23 |       NESTED LOOPS                       |                             |     1 |    68 |     3   (0)| 00:00:01 |
    |  24 |        NESTED LOOPS                      |                             | 16114 |    68 |     3   (0)| 00:00:01 |
    |  25 |         VIEW                             |                             |     1 |    28 |     2   (0)| 00:00:01 |
    |  26 |          TABLE ACCESS FULL               | SYS_TEMP_0FD9FD2FB_8ABCBB03 |     1 |    28 |     2   (0)| 00:00:01 |
    |* 27 |         INDEX RANGE SCAN                 | IDX_GDS_NO                  | 16114 |       |     1   (0)| 00:00:01 |
    |* 28 |        TABLE ACCESS BY INDEX ROWID       | K_AMR_EXCEP_FLOW            |     1 |    40 |     1   (0)| 00:00:01 |
    |  29 |      HASH GROUP BY                       |                             |     1 |    31 |   332   (2)| 00:00:04 |
    |  30 |       VIEW                               | VW_DAG_1                    |     1 |    31 |   331   (1)| 00:00:04 |
    |  31 |        HASH GROUP BY                     |                             |     1 |    33 |   331   (1)| 00:00:04 |
    |* 32 |         HASH JOIN                        |                             |     1 |    33 |   330   (1)| 00:00:04 |
    |  33 |          VIEW                            |                             |     1 |    28 |     2   (0)| 00:00:01 |
    |  34 |           TABLE ACCESS FULL              | SYS_TEMP_0FD9FD2FB_8ABCBB03 |     1 |    28 |     2   (0)| 00:00:01 |
    |  35 |          VIEW                            |                             |    47 |   235 |   328   (1)| 00:00:04 |
    |* 36 |           FILTER                         |                             |       |       |            |          |
    |  37 |            HASH GROUP BY                 |                             |    47 |  6345 |   328   (1)| 00:00:04 |
    |  38 |             VIEW                         | VW_DAG_0                    |   929 |   122K|   328   (1)| 00:00:04 |
    |  39 |              HASH GROUP BY               |                             |   929 | 55740 |   328   (1)| 00:00:04 |
    |* 40 |               TABLE ACCESS BY INDEX ROWID| K_AMR_GBTD_FLOW             |   929 | 55740 |   327   (1)| 00:00:04 |
    |* 41 |                INDEX RANGE SCAN          | IDX_MAKE_TIME               | 23042 |       |   132   (0)| 00:00:02 |
    |  42 |      HASH GROUP BY                       |                             |     1 |   150 |  8037   (1)| 00:01:37 |
    |  43 |       VIEW                               | VW_DAG_3                    |     1 |   150 |  8036   (1)| 00:01:37 |
    |  44 |        HASH GROUP BY                     |                             |     1 |    75 |  8036   (1)| 00:01:37 |
    |* 45 |         HASH JOIN                        |                             |     1 |    75 |  8035   (1)| 00:01:37 |
    |  46 |          VIEW                            |                             |     1 |    28 |     2   (0)| 00:00:01 |
    |  47 |           TABLE ACCESS FULL              | SYS_TEMP_0FD9FD2FB_8ABCBB03 |     1 |    28 |     2   (0)| 00:00:01 |
    |  48 |          VIEW                            |                             |   267 | 12549 |  8033   (1)| 00:01:37 |
    |* 49 |           FILTER                         |                             |       |       |            |          |
    |  50 |            HASH GROUP BY                 |                             |   267 | 47259 |  8033   (1)| 00:01:37 |
    |  51 |             VIEW                         | VW_DAG_2                    |  5333 |   921K|  8033   (1)| 00:01:37 |
    |  52 |              HASH GROUP BY               |                             |  5333 |   572K|  8033   (1)| 00:01:37 |
    |* 53 |               TABLE ACCESS FULL          | K_AMR_LBTZ_FLOW             |  5333 |   572K|  8032   (1)| 00:01:37 |
    |  54 |      HASH GROUP BY                       |                             |     1 |   143 |   330   (1)| 00:00:04 |
    |  55 |       VIEW                               | VW_DAG_4                    |     1 |   143 |   329   (1)| 00:00:04 |
    |  56 |        HASH GROUP BY                     |                             |     1 |    76 |   329   (1)| 00:00:04 |
    |  57 |         NESTED LOOPS                     |                             |     1 |    76 |   328   (0)| 00:00:04 |
    |  58 |          VIEW                            |                             |     1 |    16 |     2   (0)| 00:00:01 |
    |  59 |           TABLE ACCESS FULL              | SYS_TEMP_0FD9FD2FB_8ABCBB03 |     1 |    28 |     2   (0)| 00:00:01 |
    |* 60 |          TABLE ACCESS BY INDEX ROWID     | K_AMR_GBTD_FLOW             |     1 |    60 |   326   (0)| 00:00:04 |
    |* 61 |           INDEX RANGE SCAN               | IDX_MAKE_TIME               | 23042 |       |   132   (0)| 00:00:02 |
    |  62 |      HASH GROUP BY                       |                             |     1 |   143 |   332   (2)| 00:00:04 |
    |  63 |       VIEW                               | VW_DAG_6                    |     1 |   143 |   331   (1)| 00:00:04 |
    |  64 |        HASH GROUP BY                     |                             |     1 |    67 |   331   (1)| 00:00:04 |
    |* 65 |         HASH JOIN                        |                             |     1 |    67 |   330   (1)| 00:00:04 |
    |  66 |          VIEW                            |                             |     1 |    28 |     2   (0)| 00:00:01 |
    |  67 |           TABLE ACCESS FULL              | SYS_TEMP_0FD9FD2FB_8ABCBB03 |     1 |    28 |     2   (0)| 00:00:01 |
    |  68 |          VIEW                            |                             |     1 |    39 |   328   (1)| 00:00:04 |
    |* 69 |           FILTER                         |                             |       |       |            |          |
    |  70 |            HASH GROUP BY                 |                             |     1 |   169 |   328   (1)| 00:00:04 |
    |  71 |             VIEW                         | VW_DAG_5                    |    19 |  3211 |   328   (1)| 00:00:04 |
    |  72 |              HASH GROUP BY               |                             |    19 |  1786 |   328   (1)| 00:00:04 |
    |* 73 |               TABLE ACCESS BY INDEX ROWID| K_AMR_GBTD_FLOW             |    19 |  1786 |   327   (1)| 00:00:04 |
    |* 74 |                INDEX RANGE SCAN          | IDX_MAKE_TIME               | 23042 |       |   132   (0)| 00:00:02 |
    ------------------------------------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       7 - filter("A"."STAFF_NO"<>'无' AND "A"."DATA_OPER_TYPE"<>'D' AND "A"."STAFF_NO" IS NOT NULL)
       8 - access("A"."AUTH_USER_NO"='P68120521')
           filter("A"."AUTH_USER_NO"<>'无')
       9 - filter("B"."DATA_OPER_TYPE"<>'D')
      10 - access("B"."BUSS_NO"="A"."STAFF_NO")
           filter("B"."BUSS_NO"<>'无')
      11 - filter("R"."DATA_OPER_TYPE"<>'D')
      12 - access("B"."GR_ID"="R"."GR_ID")
           filter("R"."GR_ID" IS NOT NULL)
      13 - access("R"."TG_ID"="T"."TG_ID")
      14 - filter("T"."PUB_PRIV_FLAG"='01' AND "T"."RUN_STATUS_CODE"='01')
      15 - access("AA"."IDX_CODE"(+)="K"."IDX_CODE")
      17 - access("K"."IDX_CODE"='PD0002' OR "K"."IDX_CODE"='PD0004' OR "K"."IDX_CODE"='PD0006' OR 
                  "K"."IDX_CODE"='PD0008' OR "K"."IDX_CODE"='PD0009' OR "K"."IDX_CODE"='PD0012' OR "K"."IDX_CODE"='PD0013' OR 
                  "K"."IDX_CODE"='PD0014')
      18 - filter("AA"."IDX_CODE"(+)='PD0002' OR "AA"."IDX_CODE"(+)='PD0004' OR "AA"."IDX_CODE"(+)='PD0006' OR 
                  "AA"."IDX_CODE"(+)='PD0008' OR "AA"."IDX_CODE"(+)='PD0009' OR "AA"."IDX_CODE"(+)='PD0012' OR 
                  "AA"."IDX_CODE"(+)='PD0013' OR "AA"."IDX_CODE"(+)='PD0014')
      20 - filter("C"."TAG_TYPE"='02')
      21 - access("C"."TAG_NO"=:B1)
      27 - access("F1"."ORG_NO"="F"."GDS_NO")
           filter("F"."GDS_NO" IS NOT NULL)
      28 - filter("F"."TG_ID" IS NOT NULL AND ("F"."TAG_NO"='TagPBDDY' OR "F"."TAG_NO"='TagPBGZ' OR 
                  "F"."TAG_NO"='TagPBYZBPH' OR "F"."TAG_NO"='TagPBZZ') AND 
                  SUBSTR(REPLACE("FIRST_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm') AND "F1"."TG_ID"=TO_NUMBER("F"."TG_ID"))
      32 - access("F1"."TG_ID"=TO_NUMBER("FF"."TG_ID") AND "F1"."ORG_NO"="FF"."GDS_NO")
      36 - filter(COUNT("ITEM_1")>=2)
      40 - filter("F"."GDS_NO" IS NOT NULL AND "F"."TG_ID" IS NOT NULL AND "F"."TAG_NO"='TagPBGZTD')
      41 - access(SUBSTR(REPLACE("MAKE_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm'))
      45 - access("F1"."TG_ID"=TO_NUMBER("FF"."TG_ID") AND "F1"."ORG_NO"="FF"."GDS_NO")
      49 - filter(COUNT("ITEM_1")>=3)
      53 - filter("F"."GDS_NO" IS NOT NULL AND "F"."TG_ID" IS NOT NULL AND 
                  SUBSTR(REPLACE("FIRST_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm') AND "F"."TAG_NO"='TagLBTZ')
      60 - filter("F"."GDS_NO" IS NOT NULL AND "F"."TG_ID" IS NOT NULL AND "F"."TAG_NO"='TagZBBS' AND 
                  "F1"."TG_ID"=TO_NUMBER("F"."TG_ID"))
      61 - access(SUBSTR(REPLACE("MAKE_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm'))
      65 - access("F1"."TG_ID"=TO_NUMBER("FF"."TG_ID") AND "F1"."ORG_NO"="FF"."GDS_NO")
      69 - filter(COUNT("ITEM_1")>=2)
      73 - filter("F"."GDS_NO" IS NOT NULL AND "F"."TG_ID" IS NOT NULL AND "F"."TAG_NO"='TagZBBS')
      74 - access(SUBSTR(REPLACE("MAKE_TIME",'-',''),1,6)=TO_CHAR(SYSDATE@!,'yyyymm'))
      
      3秒内出结果,业务正常。
    
    
    该sql还存在优化空间,K_AMR_LBTZ_FLOW表也可以加上同样的函数索引。
    create index cpss.idx_MAKE_TIME on cpss.K_AMR_LBTZ_FLOW(substr(replace(FIRST_TIME, '-', ''), 1, 6),TAG_NO);
    
    将K_AMR_GBTD_FLOW表重复的查询同样用with改写
    
    
    针对SELECT FF.GDS_NO,
                        F1.AUTH_USER_NO,
                        COUNT(DISTINCT FF.TG_ID) COUNT,
                        'PD0009' IDX_CODE
                   FROM (SELECT F.GDS_NO, F.TG_ID
                           FROM K_AMR_GBTD_FLOW F
                          WHERE F.TG_ID IS NOT NULL
                            AND F.GDS_NO IS NOT NULL
                            AND F.TAG_NO = 'TagPBGZTD'
                            AND SUBSTR(REPLACE(MAKE_TIME, '-', ''), 1, 6) =
                                TO_CHAR(SYSDATE, 'yyyymm')
                          GROUP BY F.GDS_NO, F.TG_ID
                         HAVING COUNT(DISTINCT F.MSG_ID) >= 2) FF,
                         F1
                  WHERE F1.TG_ID = FF.TG_ID
                    AND F1.ORG_NO = FF.GDS_NO
                  GROUP BY F1.AUTH_USER_NO, FF.GDS_NO
    这条sql语句,我们可以在索引上加上更多的列,减少回表操作(但是维护索引中的各个字段,将会增加其他dml操作的时间)
    create index cpss.idx_MAKE_TIME on cpss.K_AMR_GBTD_FLOW(substr(replace(MAKE_TIME, '-', ''), 1, 6),TAG_NO,GDS_NO,TG_ID,MSG_ID);
    

      

  • 相关阅读:
    基于jQuery仿淘宝产品图片放大镜代码
    【家育通】 关于我们
    新房装修三大空鼓解决方法 为家居装修做好前奏
    MVC5+EF6 入门完整教程十一:细说MVC中仓储模式的应用
    MVC5+EF6 入门完整教程十
    MVC5+EF6 入门完整教程九
    MVC5+EF6 入门完整教程八
    MVC5+EF6 入门完整教程七
    MVC5+EF6 入门完整教程六
    MVC5+EF6 入门完整教程五
  • 原文地址:https://www.cnblogs.com/muzisanshi/p/13141532.html
Copyright © 2020-2023  润新知