对于组合索引来说,在oracle8i之前,如果where字句中没有组合索引的前导列
(即建立索引时排在第一位的字段)的话,这个组合索引在SQL语句中是不起任何作用的,
在oracle9i中引入了跳跃式扫描,也就是如果在where字句中没有前导列的话也可以使
用组合索引后面的列进行索引扫描,条件就是前导列的distinct的值不能太多,比如
100万记录中,前导列只有 "男","女" 两个值 。
不过,Oracle承认索引跳跃式扫描没有直接索引查询速度快,但可以这样说,相比于
整个表扫描(full table scan),索引跳跃式扫描的速度要快得多。
例子:
create index sex_emp_id
on emp (sex, emp_id) ;
select emp_name
from emp
where emp_id = 123;
通过执行计划可以看出,Oracle使用跳跃式索引扫描其实就是将上面的语句划分
为以下语句执行,相当于使用了sex这个前导列,所以使用上了索引。
select emp_name from emp where sex = 'F' and emp_id = 123
UNION
select emp_name from emp where sex = 'M' and emp_id = 123;
对于高顺序键(high order key)中的独特值数目(也就是前导列distinct值太多),
Oracle的索引跳跃式扫描性能将会降低。如果主列(前导列)有50个不同值,根据
上面的SQL执行拆分分析,那么Oracle要发出50条查询union才能找回结果 。