索引跳跃式扫描(INDEX SKIP SCAN)

执行计划中存在索引跳扫步骤 存在索引跳扫说明查询条件和索引定义不严格匹配

对于组合索引来说,在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才能找回结果 。

索引跳跃式扫描(INDEX SKIP SCAN)

索引跳跃式扫描(INDEX SKIP SCAN)适用于所有类型的复合B树索引(包括唯一性索引和非唯一性索引),它使那些在where条件中没有对目标索引的前导列指定查询条件但同时又对该 索引的非前导列指定了查询条件的目标SQL依然可以用上该索引,这就像是在扫描该索引时跳过了它的前导列,直接从该索引的非前导列开始扫描一样(实际的执行过程并非如此),这也是索引跳跃式扫描中"跳跃"(SKIP)一词的含义。

为什么在where条件中没有对目标索引的前导列指定查询条件但Oracle依然可以用上该索引呢?这是因为Oracle帮你对该索引的前导列的所有distinct值做了遍历。

Oracle中的索引跳跃式扫描仅仅适用于那些目标索引前导列的distinct值数量较少、后续非前导列的可选择性又非常好的情形,因为索引跳跃式扫描的执行效率一定会随着目标索引前导列的distinct值数量的递增而递减。

参考:https://www.cnblogs.com/xqzt/p/4467482.html

你可能感兴趣的:(数据库相关)