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);

  

原文地址:https://www.cnblogs.com/muzisanshi/p/13141532.html