在查询 1 上,即使 id 是索引列,也会执行全表扫描。查询 2 实现了相同的结果,但速度更快。如果查询 1 运行返回一个索引列,则它会快速返回,但如果返回非索引列或整行,则查询需要更长的时间。
在查询 3 中,它运行得很快,但列 'code' 是 VARCHAR2(10) 而不是 NUMBER(12),并且索引方式与 'id' 相同。
为什么查询 1 没有发现它应该使用索引?是否应该更改某些内容以允许索引数字列更快地执行?
[查询1]
select a1.*
from people a1
where a1.id like '119%'
and rownum < 5
解释计划
SELECT STATEMENT ALL_ROWS
成本:67 字节:2,592 基数:4
2 COUNT STOPKEY
1 TABLE ACCESS FULL TABLE people
成本:67 字节:3,240 基数:5
[查询2]
select a1.*
from people a1, people a2
where a1.id = a2.id
and a2.id like '119%'
and rownum < 5
解释计划
SELECT STATEMENT ALL_ROWS
成本:11 字节:2,620 基数:4
5 COUNT STOPKEY
4 表访问按索引行表人员
成本:3 字节:648 基数:1
3 NESTED LOOPS
成本:11 字节:2,620 基数:4
1 INDEX FAST FULL扫描索引 people_IDX3
成本:2 字节:54,796 基数:7,828
2 索引范围 扫描索引 people_IDX3
成本:2 基数:1
[查询3]
select a1.*
from people a1
where a1.code like '119%'
and rownum < 5
解释计划
SELECT STATEMENT ALL_ROWS
成本:6 字节:1,296 基数:2
3 COUNT STOPKEY
2 表访问按索引行表人员
成本:6 字节:1,296 基数:2
1 INDEX RANGE SCAN INDEX people_IDX4
成本:3 基数:2