• SQL优化案例(谓词越界)


    SQL Monitoring Report
     
    SQL Text
    ------------------------------
    SELECT TACTIC_DET_ID,
           CALC_ID,
           ORG_NO,
           CONS_ID,
           CONS_NO,
           ESTI_PQ,
           ESTI_AMT,
           YM,
           YMD,
           COLL_TIME,
           ESTI_DATE,
           ACT_AMT,
           BASE_COMP_TIME,
           BASE_TACTIC_NO,
           OVERDRAFT_VALUE,
           CONS_STATUS,
           DIRECTIVE_ID,
           EXECUTE_TYPE,
           EXECUTE_SCHEME,
           EXECUTE_DATE,
           EXECUTE_STATUS,
           TRANSIT_HANDLE_ID,
           TRANSIT_STEP,
           MR_SECT_NO,
           REMARK,
           CP_NO,
           CP_STATUS,
           CP_PRIO,
           CHANNEL_TYPE
      FROM A_RCA_TACTIC_DET A
     WHERE A.CONS_NO = :B5
       AND A.ORG_NO LIKE :B4 || '%'
       AND A.YM BETWEEN SUBSTR(:B2, 1, 6) AND :B3
       AND A.YMD >= :B2
       AND A.YMD <= :B1
     ORDER BY A.ESTI_DATE DESC
     
    Global Information
    ------------------------------
     Status              :  EXECUTING                                                                  
     Instance ID         :  2                                                                          
     Session             :  xxx (1709:38751)                                                          
     SQL ID              :  cu1ktstbq4axt                                                              
     SQL Execution ID    :  33555216                                                                   
     Execution Started   :  07/03/2020 14:28:18                                                        
     First Refresh Time  :  07/03/2020 14:28:24                                                        
     Last Refresh Time   :  07/03/2020 14:30:29                                                        
     Duration            :  131s                                                                       
     Module/Action       :  ro.cons.service.ConsViewService.getRcaTacticInfo/TH45-@dyxepm1_1:0703142819
     Service             :  app1                                                                       
     Program             :  JDBC Thin Client                                                           
     
    Binds
    ========================================================================================================================
    | Name | Position |     Type      |                                       Value                                        |
    ========================================================================================================================
    | :B5  |        1 | VARCHAR2(32)  | 6xxxxxxxx7                                                                         |
    | :B4  |        2 | VARCHAR2(128) | 3xxxxx0                                                                            |
    | :B2  |        3 | VARCHAR2(32)  | 2xxxxxxx3                                                                           |
    | :B3  |        4 | VARCHAR2(32)  | 2xxxx8                                                                             |
    | :B2  |        5 | VARCHAR2(32)  | 2xxxxxxxx3                                                                           |
    | :B1  |        6 | VARCHAR2(32)  | 2xxxxxxxx3                                                                           |
    ========================================================================================================================
     
    Global Stats
    ==================================================================================
    | Elapsed |   Cpu   |    IO    | Concurrency | Cluster  | Buffer | Read  | Read  |
    | Time(s) | Time(s) | Waits(s) |  Waits(s)   | Waits(s) |  Gets  | Reqs  | Bytes |
    ==================================================================================
    |     131 |    5.78 |      118 |        0.00 |     7.91 |   261K | 19313 | 302MB |
    ==================================================================================
     
    SQL Plan Monitoring Details (Plan Hash Value=3175721642)
    ===============================================================================================================================================================================================
    | Id   |               Operation                |           Name           |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Read  | Read  | Activity |       Activity Detail        |
    |      |                                        |                          | (Estim) |      | Active(s) | Active |       | (Actual) | Reqs  | Bytes |   (%)    |         (# samples)          |
    ===============================================================================================================================================================================================
    |    0 | SELECT STATEMENT                       |                          |         |      |           |        |     1 |          |       |       |          |                              |
    |    1 |   SORT ORDER BY                        |                          |       1 |   32 |           |        |     1 |          |       |       |          |                              |
    |    2 |    FILTER                              |                          |         |      |           |        |     1 |          |       |       |          |                              |
    |    3 |     PARTITION RANGE ITERATOR           |                          |       1 |   31 |           |        |     1 |          |       |       |          |                              |
    | -> 4 |      TABLE ACCESS BY LOCAL INDEX ROWID | A_RCA_TACTIC_DET         |       1 |   31 |       135 |     +1 |     2 |        0 | 15181 | 237MB |    70.23 | gc cr grant 2-way (4)        |
    |      |                                        |                          |         |      |           |        |       |          |       |       |          | Cpu (4)                      |
    |      |                                        |                          |         |      |           |        |       |          |       |       |          | db file sequential read (84) |
    | -> 5 |       INDEX RANGE SCAN                 | IDX_A_RCA_TACTIC_DET_YMD |       1 |   31 |       133 |     +3 |     2 |     848K |  4231 |  66MB |    29.77 | gc cr grant 2-way (3)        |
    |      |                                        |                          |         |      |           |        |       |          |       |       |          | Cpu (1)                      |
    |      |                                        |                          |         |      |           |        |       |          |       |       |          | db file sequential read (35) |
    ===============================================================================================================================================================================================
    e-row和a-rows差别很大,一般都是由于统计信息不准确导致。(还有可能是cost计算方式不合理)
    select num_rows,blocks,last_analyzed from dba_tables where table_name='A_RCA_TACTIC_DET';
    300090470   9391916 2019/11/21 4:42:00
     
    SELECT * FROM DBA_TAB_COL_STATISTICS WHERE TABLE_NAME='A_RCA_TACTIC_DET';
    CONS_NO 11736064
    YMD     1236       存在直方图信息
     
    select BLEVEL,distinct_keys,leaf_blocks,clustering_factor from dba_indexes where index_name in('IDX_A_RCA_TACTIC_DET_YMD','LOC_A_RCA_TACTIC_DET_CONSNO')
    2       11736064    2558042 295677239
    2       1236        1516690 9088619
     
    直接做个10053trace
    Column (#9): YMD(
    AvgLen: 9 NDV: 1236 Nulls: 687 Density: 0.000024
    Histogram: HtBal #Bkts: 254 UncompBkts: 254 EndPtVals: 85
    Using prorated density: 0.000000 of col #9 as selectvity of out-of-range/non-existent value pred
     
    我们发现YMD的是越界的,不在列统计信息high_value,low_value之间,导致执行计划评估不正确。
    (如果想知道cost的具体计算方式可以参SQL优化核心思想这本书,
    cost = blevel +ceiling(leaf_blocks * effective index selectivity) +ceiling(clustering_factor * effective table selectivity)
    且选择性计算方法是和high_value,low_value等值存在关联)。
     
    解决方案:
     
    重新收集统计信息。
    
    删除YMD列上的索引。(本身列的选择性就不高)
     
    profile绑定执行计划(具体操作:https://www.cnblogs.com/muzisanshi/p/11889727.html)
     
    select * from table(dbms_xplan.display_awr('cu1ktstbq4axt'))
        Plan hash value: 948946192
          
        ------------------------------------------------------------------------------------------------------------------------------------
        | Id  | Operation                            | Name                        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
        ------------------------------------------------------------------------------------------------------------------------------------
        |   0 | SELECT STATEMENT                     |                             |       |       |    34 (100)|          |       |       |
        |   1 |  SORT ORDER BY                       |                             |     1 |   219 |    34   (3)| 00:00:01 |       |       |
        |   2 |   FILTER                             |                             |       |       |            |          |       |       |
        |   3 |    PARTITION RANGE ITERATOR          |                             |     1 |   219 |    33   (0)| 00:00:01 |   KEY |   KEY |
        |   4 |     TABLE ACCESS BY LOCAL INDEX ROWID| A_RCA_TACTIC_DET            |     1 |   219 |    33   (0)| 00:00:01 |   KEY |   KEY |
        |   5 |      INDEX RANGE SCAN                | LOC_A_RCA_TACTIC_DET_CONSNO |     8 |       |    31   (0)| 00:00:01 |   KEY |   KEY |
        ------------------------------------------------------------------------------------------------------------------------------------
     
        Plan hash value: 3175721642
          
        ---------------------------------------------------------------------------------------------------------------------------------
        | Id  | Operation                            | Name                     | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
        ---------------------------------------------------------------------------------------------------------------------------------
        |   0 | SELECT STATEMENT                     |                          |       |       |    32 (100)|          |       |       |
        |   1 |  SORT ORDER BY                       |                          |     1 |   226 |    32   (4)| 00:00:01 |       |       |
        |   2 |   FILTER                             |                          |       |       |            |          |       |       |
        |   3 |    PARTITION RANGE ITERATOR          |                          |     1 |   226 |    31   (0)| 00:00:01 |   KEY |   KEY |
        |   4 |     TABLE ACCESS BY LOCAL INDEX ROWID| A_RCA_TACTIC_DET         |     1 |   226 |    31   (0)| 00:00:01 |   KEY |   KEY |
        |   5 |      INDEX RANGE SCAN                | IDX_A_RCA_TACTIC_DET_YMD |     1 |       |    31   (0)| 00:00:01 |   KEY |   KEY |
        ---------------------------------------------------------------------------------------------------------------------------------
      
    

      

  • 相关阅读:
    【文言文】从高考到程序员
    lambda方法引用总结——烧脑吃透
    秒杀苹果carplay baidu车联网API冷艳北京车展
    东君误妾我怜卿(一)
    百度快照投诉技巧案例分析百度快照就是这样刷出来的
    新浪博客是否可以放谷歌广告?如何添加
    与葡萄酒的亲密接触-选购技巧篇
    车联网高速公路智能交通解决方案
    物联网细分领域-车联网(OBD)市场分析
    APP开发选择什么框架好? 请看这里!
  • 原文地址:https://www.cnblogs.com/muzisanshi/p/13255463.html
Copyright © 2020-2023  润新知