oracle不使用索引快速全扫描或索引全扫描的原因

查找了一个有索引(单列索引)的列的所有数据,结果不使用索引快速全扫描或索引全扫描,而使用全表扫描。这是什么原因呢?


这是因为该列定义的时候,允许为空。而null值是不会存到B-tree索引里啊,那肯定不走索引了。

null值可以存储到bitmap索引里面。

查找的时候,加个is not null条件,那就走索引了。故is  null不会走索引的。


对于组合索引来说,如果其中某一列(不必须是引导列)不允许为null,其他列允许为null,那么,允许为null的列如果有null值的记录,那么这条记录也会存进btree索引。

那么,查找允许为null的列的所有数据,也会使用索引全扫描。因为查的是那个索引的列。



对于组合索引,只是引导列进行排序吗?其他列会不会进行排序?
last_name不为空,first_name允许为空
create index EMP_NAME_IX on EMPLOYEES (LAST_NAME, FIRST_NAME);

SELECT e.first_name,e.last_name from hr.employees e;
结果:
FIRST_NAME        LAST_NAME
Ellen        Abel
Sundar        Ande
Mozhe        Atkinson
David        Austin
Hermann        Baer
Shelli        Baida
Amit        Banda
Elizabeth        Bates
Sarah        Bell
David        Bernstein
Laura        Bissot


select  t.first_name from hr.employees t;
结果:
Ellen
Sundar
Mozhe
David
Hermann
Shelli
Amit
Elizabeth
Sarah
David
Laura
Harrison
Alexis

结果是以last_name排序后,last_name对应的first_name查询出来的。



如果last_name允许为空,first_name不允许为空
则引导列的null值排在最后。其他还是以引导列排序。

这个同  order by last_name,first_name按照什么排序是一样的。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值