Oracle: 通过一个案例重新认识index range scan以及复合索引的创建
1. 概述
本文的执行计划问题其实是由于统计信息的问题,而本文的主要目的是重新认识一下index range scan以及复合索引。结论是前导列在where条件中不适合出现范围条件,这个在以前有提到过:“Oracle BTREE索引创建一般性经验(主要是前3条)”。
2. 索引和表信息:
TABLE_NAME INDEX_NAME INDEXED_COLUMNS PARTITIONED INDEX_MB TABLE_MB
-------------- --------------------- ------------------ ------------- ---------- ----------
T_DATECHAR T_DATECHAR_NI5_NEW CHRDT,pdr_no NO VISIBLE 40000 223200
T_DATECHAR T_DATECHAR_NI6_NEW pdr_no,CHRDT NO VISIBLE 35137 223200
注:
CHRDT的值是类似于’20210305’的形式。两个索引只是列的顺序不同。
PDR_NO是distinct值较多的字段。
3. 两个类似SQL的执行计划与区别
3.1 SQL1 CHRDT为范围条件
SELECT WXYZ.org_jrn_no
FROM XOWNER.T_DATECHAR WXYZ
WHERE WXYZ.pdr_no = '123432410643'
AND WXYZ.ac_typ = '808'
AND CHRDT >= '20210305'
AND CHRDT <= '20210307'
AND WXYZ.oth_no != '03');
Execution Plan
--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 440 | 5