<pre name="code" class="sql">explain plan for 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' and c.vou_start_no is not null and c.vou_status is not null order by vou asc) where rownum < 2; select * from table(dbms_xplan.display()); Plan hash value: 1521997440 ----------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | ----------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 85 | | 15567 (2)| 00:03:07 | |* 1 | COUNT STOPKEY | | | | | | | | 2 | VIEW | | 268 | 22780 | | 15567 (2)| 00:03:07 | |* 3 | SORT ORDER BY STOPKEY | | 268 | 70216 | | 15567 (2)| 00:03:07 | |* 4 | HASH JOIN | | 268 | 70216 | | 15566 (2)| 00:03:07 | | 5 | TABLE ACCESS FULL | COMC_BOX | 1013 | 23299 | | 5 (0)| 00:00:01 | |* 6 | HASH JOIN | | 21678 | 5059K| | 15560 (2)| 00:03:07 | |* 7 | TABLE ACCESS FULL | AUTO_COMC_CLERK | 645 | 19995 | | 9 (0)| 00:00:01 | |* 8 | HASH JOIN | | 3594 | 730K| | 15550 (2)| 00:03:07 | |* 9 | TABLE ACCESS BY INDEX ROWID| COMR_CLERK_VOU | 124 | 12648 | | 122 (0)| 00:00:02 | |* 10 | INDEX RANGE SCAN | COMR_CLERK_VOU_IDX3 | 124 | | | 28 (0)| 00:00:01 | |* 11 | HASH JOIN ANTI | | 289 | 30634 | 2488K| 15427 (2)| 00:03:06 | |* 12 | TABLE ACCESS FULL | COMR_CIFBINFO | 28899 | 2144K| | 7735 (2)| 00:01:33 | | 13 | 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_START_NO" IS NOT NULL) 10 - access("C"."VOU_TYPE"=11 AND "C"."SUB_VOU_TYPE"=0) filter("C"."VOU_STATUS" LIKE '%0%' AND "C"."VOU_STATUS" IS NOT NULL AND "C"."SUB_VOU_TYPE"=0 AND "C"."VOU_STATUS" IS NOT NULL) 11 - access("TA"."CUST_NO"="A"."CUST_NO") 12 - 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') 访问了comr_clerk_vou c 对应索引为 create index COMR_CLERK_VOU_IDX3 on COMR_CLERK_VOU (VOU_TYPE, VOU_STATUS, SUB_VOU_TYPE) tablespace APP_DATA 查看实际的数据访问量: SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID djqtt6d1vgz75, child number 0 ------------------------------------- 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%' Plan hash value: 1521997440 ------------------------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | OMem | 1Mem | Used-Mem | ------------------------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:05.02 | 41155 | 12584 | | | | |* 1 | COUNT STOPKEY | | 1 | | 1 |00:00:05.02 | 41155 | 12584 | | | | | 2 | VIEW | | 1 | 268 | 1 |00:00:05.02 | 41155 | 12584 | | | | |* 3 | SORT ORDER BY STOPKEY | | 1 | 268 | 1 |00:00:05.02 | 41155 | 12584 | 77824 | 77824 | | |* 4 | HASH JOIN | | 1 | 268 | 301K|00:00:04.71 | 41155 | 12584 | 963K| 963K| 1305K (0)| | 5 | TABLE ACCESS FULL | COMC_BOX | 1 | 1013 | 1013 |00:00:00.01 | 15 | 0 | | | | |* 6 | HASH JOIN | | 1 | 21678 | 2100K|00:00:03.65 | 41140 | 12584 | 1000K| 1000K| 1348K (0)| |* 7 | TABLE ACCESS FULL | AUTO_COMC_CLERK | 1 | 645 | 648 |00:00:00.01 | 30 | 0 | | | | |* 8 | HASH JOIN | | 1 | 3594 | 301K|00:00:03.01 | 41110 | 12584 | 763K| 763K| 1231K (0)| |* 9 | TABLE ACCESS BY INDEX ROWID| COMR_CLERK_VOU | 1 | 124 | 538 |00:00:00.11 | 878 | 0 | | | | |* 10 | INDEX RANGE SCAN | COMR_CLERK_VOU_IDX3 | 1 | 124 | 538 |00:00:00.11 | 361 | 0 | | | | |* 11 | HASH JOIN ANTI | | 1 | 289 | 831 |00:00:02.80 | 40232 | 12584 | 56M| 4221K| 64M (0)| |* 12 | TABLE ACCESS FULL | COMR_CIFBINFO | 1 | 28899 | 558K|00:00:00.69 | 28292 | 12584 | | | | | 13 | INDEX FAST FULL SCAN | CIFACCTNO_IDX2 | 1 | 2110K| 2013K|00:00:00.42 | 11940 | 0 | | | | ------------------------------------------------------------------------------------------------------------------------------------------------------- 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((INTERNAL_FUNCTION("E"."POST_NO") AND "E"."FLAG"='0')) 8 - access("A"."BANK_CORP_CODE"="C"."BANK_CORP_CODE") 9 - filter("C"."VOU_START_NO" IS NOT NULL) 10 - access("C"."VOU_TYPE"=11 AND "C"."SUB_VOU_TYPE"=0) filter(("C"."VOU_STATUS" LIKE '%0%' AND "C"."VOU_STATUS" IS NOT NULL AND "C"."SUB_VOU_TYPE"=0 AND "C"."VOU_STATUS" IS NOT NULL)) 11 - access("TA"."CUST_NO"="A"."CUST_NO") 12 - 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')) 55 rows selected. |* 10 | INDEX RANGE SCAN | COMR_CLERK_VOU_IDX3 | 1 | 124 | 538 |00 访问了538条记录,看到SORT ORDER BY STOPKEY 就肯定有问题里,分页语句不允许出现SORT ORDER BY STOPKEY 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')) SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID 2pqcknku6yaby, child number 0 ------------------------------------- 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. Plan hash value: 2236318696 ---------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | ---------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.87 | 26008 | 4 | |* 1 | COUNT STOPKEY | | 1 | | 1 |00:00:00.87 | 26008 | 4 | | 2 | VIEW | | 1 | 1 | 1 |00:00:00.87 | 26008 | 4 | | 3 | NESTED LOOPS ANTI | | 1 | 1 | 1 |00:00:00.87 | 26008 | 4 | | 4 | NESTED LOOPS | | 1 | 100 | 7901 |00:00:00.85 | 18814 | 4 | | 5 | NESTED LOOPS | | 1 | 1 | 3 |00:00:00.01 | 706 | 4 | | 6 | NESTED LOOPS | | 1 | 168 | 102 |00:00:00.01 | 537 | 4 | |* 7 | TABLE ACCESS BY INDEX ROWID| COMR_CLERK_VOU | 1 | 124 | 3 |00:00:00.01 | 500 | 4 | |* 8 | INDEX RANGE SCAN | IDX_COMR_CLERK_VOU | 1 | 280 | 522 |00:00:00.01 | 5 | 4 | |* 9 | TABLE ACCESS FULL | COMC_BOX | 3 | 12 | 102 |00:00:00.01 | 37 | 0 | |* 10 | TABLE ACCESS BY INDEX ROWID | AUTO_COMC_CLERK | 102 | 1 | 3 |00:00:00.01 | 169 | 0 | |* 11 | INDEX UNIQUE SCAN | AUTO_COMC_CLERK_INX | 102 | 1 | 93 |00:00:00.01 | 105 | 0 | |* 12 | TABLE ACCESS BY INDEX ROWID | COMR_CIFBINFO | 3 | 100 | 7901 |00:00:00.84 | 18108 | 0 | |* 13 | INDEX RANGE SCAN | CIFB_IDX2 | 3 | 101 | 7901 |00:00:00.81 | 10319 | 0 | |* 14 | INDEX RANGE SCAN | CIFACCTNO_IDX2 | 7021 | 2110K| 7020 |00:00:00.02 | 7194 | 0 | ---------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(ROWNUM<2) 7 - filter(("C"."VOU_STATUS" LIKE '%0%' AND "C"."VOU_STATUS" IS NOT NULL AND "C"."VOU_START_NO" IS NOT NULL 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((INTERNAL_FUNCTION("E"."POST_NO") 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") 57 rows selected. select count(*) from COMR_CLERK_VOU --268601 select count(*) from COMR_CLERK_VOU C where ("C"."VOU_TYPE"=11 AND "C"."SUB_VOU_TYPE"=0) --34308 select count(*) from COMR_CLERK_VOU C where ("C"."VOU_TYPE"=11 AND "C"."SUB_VOU_TYPE"=0) and (("C"."VOU_STATUS" LIKE '%0%' AND "C"."VOU_STATUS" IS NOT NULL AND "C"."VOU_START_NO" IS NOT NULL AND "C"."VOU_STATUS" IS NOT NULL)) --538 分页语句创建索引: 按where 条件列+order by 列创建索引