Oraclei里的仅索引(indexonly)执行计划在Oraclei里得到了加强所以现在能够提供对基于函数的索引(functionbased indexFBI)的支持Oracle的索引组织表(indexorganized tableIOT)是一个很好的例子能够说明Oracle如何在可能的时候忽略对表格的访问简而言之每当Oracle SQL优化器检测到它能够为查询提供服务而不需要触及表格行的时候Oracle就会调用一个完整的索引扫描快速读取索引的每个块而不需要触及表格本身
完整索引执行计划要比访问表格更快其原因有两个
DB_FILE_MULTIBLOCK_READ_COUNT会被调用以便更快地预先取回索引块
完整索引扫描能够使用Oracle的平行查询
在Oraclei之前的版本里只有在索引被创建而且不带有任何NULL值的时候仅索引扫描才可能被使用FBI是Oracle的一个福音它们事实上能够消除任何不必要的完整表格扫描由于FBI能够精确地复制查询的WHERE子句里的任何数据列所以它们一般都被用来确保索引正在服务查询
为了说明完全索引扫描如何同FBI一起工作现在让我们来看下面这个关于学生的简单表格
create table student( student_name date_of_birth);
利用这个表格我们在表格所有的数据列上创建了一个已连接的FBI
create index whole_studenton student( initcap(student_name) to_char(date_of_birthMMDDYY));
Oraclei知道参照SQL陈述式里这些数据列的任何查询都能够使用完整索引扫描
select * from studentwhere initcap(student_name) = Jones;select * from studentwhere to_char(date_of_birthMMDD=YY) = ;
那么什么时候Oracle会选择完整索引扫描呢?实际上完整索引扫描是非常少见的其原因有两个
Oraclei会要求WHERE子句里的所有判断述词(predicate)都匹配索引里的这些数据列
任何指定的数据列都有众多的内置函数可用因此更有可能的情况是会存在完全匹配查询的索引