oracle点知识6——索引跳跃式扫描

以下内容整理自网络:

索引跳跃式扫描(index skip scan)是Oracle9i用来提高性能的新特性,对于使用复合索引的数据库应用程序意义尤为重大。   

复合索引(又称为连接索引)是一个包含多个字段的索引。在ORACLE9i以前的ORACLE版本里,只有那些在WHERE子句里引用整个索引或者是引用索引的一个或多个前导字段的查询,才能使复合索引有效而提高检索效率。而在ORACLE9i里,一个复合索引即使在一次查询中没有使用前导字段,也可能通过“索引跳跃式扫描”被有效引用(比如有两个字段id,name;我们只使用了name这个字段作为索引,而没有使用id,这样也可以通过 索引跳跃式扫描)。在一次跳跃式扫描中,每个复合索引前导字段的独特值(DISTINCT
VALUE)只会被搜索一次,ORACLE9i会在复合索引前导字段每个独特值区间结合WHERE子句中的其它复合索引字段搜索符合条件的目标记录,这种做法的结果导致了在索引中的跳跃式扫描。

索引跳跃式扫描主要有两个优点:

1、以前版本中的表扫描(TABLE SCAN)可能会转变为索引扫描,提高了某些查询的执行效率;

2、应用程序使用较少的索引就能达到提高效能的目的,并且既节省存储空间,又能提高DML和维护操作的效率。

我们通过下面的示例,彻底了解索引跳跃式扫描的含义:

索引跳跃式扫描(index skip scan)是Oracle9i的一个新的执行特性,尤其适用于使用连接索引和访问多值索引的Oracle查询。让我们看以下的范例。请注意到以下代码包含着连接索引:

create index
    sex_emp_id
  on
    emp (sex, emp_id)
  ;

  在Oracle9i版本之前,当SQL查询中包含性别和emp_id时,或者查询指定性别行的时候才可以使用这一索引。下面的查询不能够使用连接索引:

select
    emp_id
  from
    emp
  where
    emp_id = 123;

  Oracle9i的索引跳跃式扫描执行规则允许使用连接索引,即使SQL查询中不指定性别。这一特性使得无需在emp_id行中提供第二个索引。Oracle承认索引跳跃式扫描没有直接索引查询速度快,但可以这样说,相比于整个表扫描(table scan),索引跳跃式扫描的速度要快得多。

  当Oracle没有指明索引跳跃式扫描的内部内容时,我们可以从它的执行规则中判断出,Oracle在内部上生成了多个查询,这样就满足带有多个子查询的查询。

SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=1 Bytes=5)
0 SORT (AGGREGATE)
1 INDEX (SKIP SCAN) OF 'SEX_EMP_ID' (NON-UNIQUE)

  在内部里,Oracle生成了两个查询,并连接结果的ROWID表。

selectemp_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)中的独特值数目,Oracle的索引跳跃式扫描性能将会降低。如果主列有50个值,Oracle要发出50条查询才能找回结果。索引跳跃式扫描只适用于硬盘空间和存储空间相当紧缺的情况。

时间: 2025-01-29 20:18:27

oracle点知识6——索引跳跃式扫描的相关文章

oracle点知识8——索引组织表

关于索引的入门参照博客:http://blog.csdn.net/changyanmanman/article/details/7097318 索引组织表(index organized table, IOT)就是存储在一个索引结构中的表.存储在堆中的表是无组织的(也就是说,只要有可用的空间,数据可以放在任何地方),IOT中的数据则按主键存储和排序.对你的应用来说,IOT表和一个"常规"表并无二致. IOT有什么意义呢?使用堆组织表时,我们必须为表和表主键上的索引分别留出空间.而IOT

oracle点知识8——索引聚簇和哈希聚簇

原文整理自网络: Oracle支持两种类型的聚簇: 索引聚簇和哈希聚簇 1. 什么是聚簇 聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的.聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点.非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块.一个表最多只能有一个聚簇索引. 2. 使用 Oracle 聚簇索引 聚簇是一种存储表的方法,这些表密切相关并经常一起连接进磁盘的同一区域.例如,表 BOOKSHELF 和BOOKSHELF_

Oracle优化笔记访问索引的方法

  索引唯一性扫描(INDEX UNIQUE SCAN)(针对unique index的扫描)比索引范围扫描(INDEX UNIQUE SCAN)需要的逻辑读至少少1,这是因为索引唯一行扫描明确只有最多一行数据返回,而索引范围扫描则可能有多行数据返回,得到第一行数据之后还会向下至少再扫一个叶子节点. 索引全扫描(INDEX FULL SCAN):索引全扫描不需要扫描该索引的所有分支块,oracle在做索引全扫描的时候只需要访问必要的分支块的定位到位于该索引最左边的叶子块的第一行索引行,通过叶子块

【oracle】index的几种扫描方式

常见的index 相关的扫描方式大概有如下几种: index range scan(索引范围扫描): 1.对于unique index来说,如果where 条件后面出现了<,> ,between ...and...的时候,那么就可能执行index range scan,如果where条件后面是=,那么就会执行index unique scan. 2.对于none unique index来说 如果where 条件后面出现了=,>,<,betweed...and...的时候,就有可能

Oracle数据库中建立索引的基本方法讲解_oracle

怎样建立最佳索引? 1.明确地创建索引 create index index_name on table_name(field_name) tablespace tablespace_name pctfree 5 initrans 2 maxtrans 255 storage ( minextents 1 maxextents 16382 pctincrease 0 ); 2.创建基于函数的索引 常用与UPPER.LOWER.TO_CHAR(date)等函数分类上,例: create index

Oracle之不可见索引

Oracle之不可见索引 1  BLOG文档结构图   2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Oracle不可见索引的使用   Tips: ① 本文在ITpub(http://blog.itpub.net/26736162).博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)有同步更新 ② 文章中用到的所有代码,相关软

ORACLE的分区与索引

oracle的分区和索引可以说是它自己的亮点,可能你会说在其他数据库上也有,嗯是的,但oracle的种类性能便利性可以说是比较人性化的,下面我们通过实验来阐述它们的特性和功能. 1.分别给出一个B-tree索引针对全表扫描性能高和低的例子. 索引定义:oracle数据库中索引就是为了加快数据访问速度的一种目录结构 B-tree索引特点: (1)二叉树结构 (2)用比较大小方式查找索引块 (3)适合创建在键值重复率低的字段 例如  主键字段:强调表的参照关系,即可以被外键引用 唯一性约束字段:强调

为什么Oracle有时会用索引来查找数据?

当你运用SQL语言,向数据库发布一条查询语句时,ORACLE将伴随产生一个"执行计划",也就是该语句将通过何种数据搜索方案执行,是通过全表扫描.还是通过索引搜寻等其它方式.搜索方案的选用与ORACLE的优化器息息相关. SQL语句的执行步骤 一条SQL语句的处理过程要经过以下几个步骤. 1 语法分析 分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2 语义分析 检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3 视图转换 将涉及视图的查询语句转换为相应的对基表查询

Oracle中如何管理索引组织表

索引组织表(IOT)有一种类B树的存储组织方法.普通的堆组织表是以一种无序的集合存储.而IOT中的数据是按主键有序的存储在B树索引结构中.与一般B树索引不同的的是,在IOT中每个叶结点即有每行的主键列值,又有那些非主键列值. 在IOT所对应的B树结构中,每个索引项包括<主键列值,非主键列值>而不是ROWID,对于普通堆组织表,oracle会有对应的索引与之对应,且分开存储.换句话说,IOT即是索引,又是实际的数据. 索引组织表(IOT)不仅可以存储数据,还可以存储为表建立的索引.索引组织表的数