• 分页SQL走全表扫描导致TEMP耗尽


    .查看SQL信息:
    select *
      from (select   
                             a.cert_type,
                   a.cert_no,
                   a.cust_name,
                   e.oper_no,
                   to_char(c.vou_start_no + instr(c.vou_status, '0') - 1,
                           'fm00000000') as vou,
                   e.bran_code
              from comr_cifbinfo   a,
                   comc_box        b,
                   comr_clerk_vou  c,
                   auto_comc_clerk e
             where a.cert_type = '1'
               and substr(rtrim(a.cert_no), 18, 1) is not null
               and a.cert_no not in
                   ('330721197211217006X', '1302011981101070315')
               and a.valid_flag = '0'
               and not exists
             (select  * from comr_cifacctno ta where ta.cust_no = a.cust_no)
               and c.vou_status like '%0%'
               and b.bran_code = e.bran_code
               and c.bran_code = e.bran_code
               and a.bank_corp_code = c.bank_corp_code
               and b.box_no = c.box_no
               and b.oper_no = e.oper_no
               and c.vou_status like '%0%'
               and c.vou_type = '11'
               and c.sub_vou_type = '0'
               and e.post_no in ('12002', '12402')
               and e.flag = '0'
             order by vou asc)
     where rownum < 2;
    对应的执行计划为:
    Plan hash value: 2629361789
     
    -------------------------------------------------------------------------------------------------------
    | Id  | Operation                   | Name            | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |                 |     1 |    85 |       | 16722   (2)| 00:03:21 |
    |*  1 |  COUNT STOPKEY              |                 |       |       |       |            |          |
    |   2 |   VIEW                      |                 |   266 | 22610 |       | 16722   (2)| 00:03:21 |
    |*  3 |    SORT ORDER BY STOPKEY    |                 |   266 | 68096 |       | 16722   (2)| 00:03:21 |
    |*  4 |     HASH JOIN               |                 |   266 | 68096 |       | 16721   (2)| 00:03:21 |
    |   5 |      TABLE ACCESS FULL      | COMC_BOX        |  1013 | 23299 |       |     5   (0)| 00:00:01 |
    |*  6 |      HASH JOIN              |                 | 21563 |  4906K|       | 16715   (2)| 00:03:21 |
    |*  7 |       TABLE ACCESS FULL     | AUTO_COMC_CLERK |   642 | 19902 |       |     9   (0)| 00:00:01 |
    |*  8 |       HASH JOIN             |                 |  3594 |   708K|       | 16705   (2)| 00:03:21 |
    |*  9 |        TABLE ACCESS FULL    | COMR_CLERK_VOU  |   124 | 11904 |       |  1278   (2)| 00:00:16 |
    |* 10 |        HASH JOIN ANTI       |                 |   289 | 30634 |  2488K| 15427   (2)| 00:03:06 |
    |* 11 |         TABLE ACCESS FULL   | COMR_CIFBINFO   | 28899 |  2144K|       |  7735   (2)| 00:01:33 |
    |  12 |         INDEX FAST FULL SCAN| CIFACCTNO_IDX2  |  2110K|    60M|       |  3326   (2)| 00:00:40 |
    -------------------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(ROWNUM<2)
       3 - filter(ROWNUM<2)
       4 - access("B"."BRAN_CODE"="E"."BRAN_CODE" AND "B"."BOX_NO"="C"."BOX_NO" AND 
                  "B"."OPER_NO"="E"."OPER_NO")
       6 - access("C"."BRAN_CODE"="E"."BRAN_CODE")
       7 - filter(("E"."POST_NO"='12002' OR "E"."POST_NO"='12402') AND "E"."FLAG"='0')
       8 - access("A"."BANK_CORP_CODE"="C"."BANK_CORP_CODE")
       9 - filter("C"."VOU_TYPE"=11 AND "C"."VOU_STATUS" LIKE '%0%' AND "C"."VOU_STATUS" IS NOT 
                  NULL AND "C"."SUB_VOU_TYPE"=0)
      10 - access("TA"."CUST_NO"="A"."CUST_NO")
      11 - filter(SUBSTR(RTRIM("A"."CERT_NO"),18,1) IS NOT NULL AND "A"."CERT_TYPE"='1' AND 
                  "A"."VALID_FLAG"='0' AND "A"."CERT_NO"<>'330721197211217006X' AND 
                  "A"."CERT_NO"<>'1302011981101070315')
    
    此SQL是典型的分页SQL,按照COMR_CLERK_VOU的to_char(c.vou_start_no + instr(c.vou_status, '0') - 1, 'fm00000000') as vou进行排序,这个走全表扫描,则会对整个表进行排序在取一条,实际上取一条不需要对整个表排序,分页语句不能出现SORT ORDER BY STOPKEY。
    3.创建索引和添加hints:
    create index idx_comr_clerk_vou on comr_clerk_vou(vou_type,sub_vou_type,to_char(vou_start_no + instr(vou_status, '0') - 1,
                        'fm00000000'))
    
    select *
      from (select   
                           /*+ index_asc(c  idx_comr_clerk_vou)   */  a.cert_type,
                   a.cert_no,
                   a.cust_name,
                   e.oper_no,
                   to_char(c.vou_start_no + instr(c.vou_status, '0') - 1,
                           'fm00000000') as vou,
                   e.bran_code
              from comr_cifbinfo   a,
                   comc_box        b,
                   comr_clerk_vou  c,
                   auto_comc_clerk e
             where a.cert_type = '1'
               and substr(rtrim(a.cert_no), 18, 1) is not null
               and a.cert_no not in
                   ('330721197211217006X', '1302011981101070315')
               and a.valid_flag = '0'
               and not exists
             (select  * from comr_cifacctno ta where ta.cust_no = a.cust_no)
               and c.vou_status like '%0%'
               and b.bran_code = e.bran_code
               and c.bran_code = e.bran_code
               and a.bank_corp_code = c.bank_corp_code
               and b.box_no = c.box_no
               and b.oper_no = e.oper_no
               and c.vou_status like '%0%'
               and c.vou_type = '11'
               and c.sub_vou_type = '0'
               and e.post_no in ('12002', '12402')
               and e.flag = '0'
             order by vou asc)
     where rownum < 2;
    此时查看执行计划:
    Plan hash value: 2236318696
     
    ---------------------------------------------------------------------------------------------------------
    | Id  | Operation                         | Name                | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                  |                     |     1 |    85 |   790   (1)| 00:00:10 |
    |*  1 |  COUNT STOPKEY                    |                     |       |       |            |          |
    |   2 |   VIEW                            |                     |     1 |    85 |   790   (1)| 00:00:10 |
    |   3 |    NESTED LOOPS ANTI              |                     |     1 |   256 |   790   (1)| 00:00:10 |
    |   4 |     NESTED LOOPS                  |                     |   100 | 22600 |   589   (1)| 00:00:08 |
    |   5 |      NESTED LOOPS                 |                     |     1 |   150 |   361   (1)| 00:00:05 |
    |   6 |       NESTED LOOPS                |                     |   168 | 19992 |   284   (1)| 00:00:04 |
    |*  7 |        TABLE ACCESS BY INDEX ROWID| COMR_CLERK_VOU      |   124 | 11904 |   232   (0)| 00:00:03 |
    |*  8 |         INDEX RANGE SCAN          | IDX_COMR_CLERK_VOU  |   280 |       |     3   (0)| 00:00:01 |
    |*  9 |        TABLE ACCESS FULL          | COMC_BOX            |    12 |   276 |     4   (0)| 00:00:01 |
    |* 10 |       TABLE ACCESS BY INDEX ROWID | AUTO_COMC_CLERK     |     1 |    31 |     1   (0)| 00:00:01 |
    |* 11 |        INDEX UNIQUE SCAN          | AUTO_COMC_CLERK_INX |     1 |       |     0   (0)| 00:00:01 |
    |* 12 |      TABLE ACCESS BY INDEX ROWID  | COMR_CIFBINFO       |   100 |  7600 |   229   (1)| 00:00:03 |
    |* 13 |       INDEX RANGE SCAN            | CIFB_IDX2           |   101 |       |   128   (2)| 00:00:02 |
    |* 14 |     INDEX RANGE SCAN              | CIFACCTNO_IDX2      |  2110K|    60M|     2   (0)| 00:00:01 |
    ---------------------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(ROWNUM<2)
       7 - filter("C"."VOU_STATUS" LIKE '%0%' AND "C"."VOU_STATUS" IS NOT NULL)
       8 - access("C"."VOU_TYPE"=11 AND "C"."SUB_VOU_TYPE"=0)
       9 - filter("B"."BOX_NO"="C"."BOX_NO")
      10 - filter(("E"."POST_NO"='12002' OR "E"."POST_NO"='12402') AND "E"."FLAG"='0' AND 
                  "B"."BRAN_CODE"="E"."BRAN_CODE" AND "C"."BRAN_CODE"="E"."BRAN_CODE")
      11 - access("B"."OPER_NO"="E"."OPER_NO")
      12 - filter("A"."VALID_FLAG"='0')
      13 - access("A"."CERT_TYPE"='1' AND "A"."BANK_CORP_CODE"="C"."BANK_CORP_CODE")
           filter(SUBSTR(RTRIM("A"."CERT_NO"),18,1) IS NOT NULL AND 
                  "A"."CERT_NO"<>'330721197211217006X' AND "A"."CERT_NO"<>'1302011981101070315' AND 
                  "A"."BANK_CORP_CODE"="C"."BANK_CORP_CODE")
      14 - access("TA"."CUST_NO"="A"."CUST_NO")
    
    此时SORT ORDER BY STOPKEY消失,通过索引访问最理想的情况只需要访问一条数据就停止索引扫描,这样节省了大量的排序工作。

  • 相关阅读:
    Python Module_Socket_网络编程
    Python Module_Socket_网络编程
    从 2017 OpenStack Days China 看国内云计算的发展现状
    从 2017 OpenStack Days China 看国内云计算的发展现状
    说说excel
    一种防脱裤撞库的可能性?
    黑白相片变彩色相片的一种可能性?
    为什么需求文档一定要电子化?
    一个网页布局练习
    css田字格布局
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13352151.html
Copyright © 2020-2023  润新知