以前一直以为对索引列使用函数,会导致不使用索引(针对普通索引,非函数索引)
可是今天碰到一个查询,却发现用substr和like都能使用到索引
索引定义:create index INV.MTL_SYSTEM_ITEMS_B_N1 on INV.MTL_SYSTEM_ITEMS_B (ORGANIZATION_ID, SEGMENT1);
SQL> edit
已写入文件 afiedt.buf
1 SELECT msi.inventory_item_id
2 FROM mtl_system_items_b msi
3 WHERE msi.organization_id = 107
4* AND msi.segment1 LIKE '008%'
SQL> /
未选定行
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=14)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MTL_SYSTEM_ITEMS_B' (Cos
t=4 Card=1 Bytes=14)
2 1 INDEX (RANGE SCAN) OF 'MTL_SYSTEM_ITEMS_B_N1' (NON-UNIQU
E) (Cost=3 Card=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
3 physical reads
0 redo size
152 bytes sent via SQL*Net to client
235 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
SQL> edit
已写入文件 afiedt.buf
1 SELECT msi.inventory_item_id
2 FROM mtl_system_items_b msi
3 WHERE msi.organization_id = 107
4* AND substr(msi.segment1, 1, 3) = '008'
SQL> /
未选定行
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=156 Card=184 Bytes=2
576)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MTL_SYSTEM_ITEMS_B' (Cos
t=156 Card=184 Bytes=2576)
2 1 INDEX (RANGE SCAN) OF 'MTL_SYSTEM_ITEMS_B_N1' (NON-UNIQU
E) (Cost=81 Card=184)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
58 consistent gets
55 physical reads
0 redo size
152 bytes sent via SQL*Net to client
235 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed