查找了一个有索引(单列索引)的列的所有数据,结果不使用索引快速全扫描或索引全扫描,而使用全表扫描。这是什么原因呢?
这是因为该列定义的时候,允许为空。而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按照什么排序是一样的。