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;
之前的SQL 由于有坑爹的c.vou_status like '%0%' 条件,导致最终分页SQL无法彻底优化,这次先把like搞掉
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID gv9chqfu3770y, 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 /* a
Plan hash value: 2236318696
-------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.28 | 12288 |
|* 1 | COUNT STOPKEY | | 1 | | 1 |00:00:00.28 | 12288 |
| 2 | VIEW | | 1 | 1 | 1 |00:00:00.28 | 12288 |
| 3 | NESTED LOOPS ANTI | | 1 | 1 | 1 |00:00:00.28 | 12288 |
| 4 | NESTED LOOPS | | 1 | 103 | 3843 |00:00:00.26 | 7317 |
| 5 | NESTED LOOPS | | 1 | 1 | 1 |00:00:00.01 | 406 |
| 6 | NESTED LOOPS | | 1 | 179 | 198 |00:00:00.01 | 89 |
| 7 | TABLE ACCESS BY INDEX ROWID| COMR_CLERK_VOU | 1 | 2487 | 6 |00:00:00.01 | 9 |
|* 8 | INDEX RANGE SCAN | IDX_COMR_CLERK_VOU | 1 | 15 | 6 |00:00:00.01 | 3 |
|* 9 | TABLE ACCESS FULL | COMC_BOX | 6 | 12 | 198 |00:00:00.01 | 80 |
|* 10 | TABLE ACCESS BY INDEX ROWID | AUTO_COMC_CLERK | 198 | 1 | 1 |00:00:00.01 | 317 |
|* 11 | INDEX UNIQUE SCAN | AUTO_COMC_CLERK_INX | 198 | 1 | 162 |00:00:00.01 | 202 |
|* 12 | TABLE ACCESS BY INDEX ROWID | COMR_CIFBINFO | 1 | 100 | 3843 |00:00:00.26 | 6911 |
|* 13 | INDEX RANGE SCAN | CIFB_IDX2 | 1 | 101 | 3843 |00:00:00.25 | 3138 |
|* 14 | INDEX RANGE SCAN | CIFACCTNO_IDX2 | 3843 | 2110K| 3842 |00:00:00.01 | 4971 |
-------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(ROWNUM<2)
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")
55 rows selected.
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'))
|* 8 | INDEX RANGE SCAN | IDX_COMR_CLERK_VOU | 1 | 15 | 6 |00:00:00.01 | 3 |
此时扫描了6条记录停止