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

来源:互联网 发布:柠檬网络电视台 编辑:程序博客网 时间:2024/06/10 10:46

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


这是因为该列定义的时候,允许为空。而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按照什么排序是一样的。



原创粉丝点击