Oracle索引扫描的4个类别

学习Oracle时,你可能会遇到Oracle索引扫描问题,这里将介绍Oracle索引扫描问题的解决方法,在这里拿出来和大家分享一 下。根据索引的类型与where限制条件的不同,有4种类型的Oracle索引扫描:

◆索引唯一扫描(index unique scan)

◆索引范围扫描(index range scan)

◆索引全扫描(index full scan)

◆索引快速扫描(index fast full scan)

(1) 索引唯一扫描(index unique scan)

通过唯一索引查找一个数值经常返回单个ROWID。如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询 中,如创建一个索引:create index idx_test on emp(ename, deptno, loc)。则select ename from emp where ename = ‘JACK’ and  deptno = ‘DEV’语句可以使用该索引。如果该语句只返回一行,则存取方法称为索引唯一扫描。而select ename from emp where deptno  = ‘DEV’语句则不会使用该索引,因为where子句种没有引导列。如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话, Oracle经常实现唯一性扫描。

使用唯一性约束的例子:

1. SQL> explain plan for

2. select empno,ename from emp where empno=10;

3. Query Plan

4. SELECT STATEMENT [CHOOSE] Cost=1

5. TABLE ACCESS BY ROWID EMP [ANALYZED]

6. INDEX UNIQUE SCAN EMP_I1

13:21:39 SQL> set autotrace on;

13:21:44 SQL> select * from emp where empno=7788;

EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

Execution Plan

----------------------------------------------------------

Plan hash value: 2949544139

--------------------------------------------------------------------------------------

| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |        |     1 |    87 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    87 |     2   (0)| 00:00:01 |

|*  2 |   INDEX UNIQUE SCAN         | PK_EMP |     1 |       |     1   (0)| 00:00:01 |

--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - access("EMPNO"=7788)

Statistics

----------------------------------------------------------

0  recursive calls

0  db block gets

2  consistent gets

0  physical reads

0  redo size

732  bytes sent via SQL*Net to client

374  bytes received via SQL*Net from client

1  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

1  rows processed

(2) 索引范围扫描(index range scan)

使用一个索引存取多行数据,同上面一样,如果索引是组合索引,如(1)所示,而且select ename from emp where ename = ‘JACK’ and  deptno = ‘DEV’语句返回多行数据,虽然该语句还是使用该组合索引进行查询,可此时的存取方法称为索引范围扫描。在唯一索引上使用 索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围操作符(如>、<、<>、>=、<=、between)

使用索引范围扫描的例子:

1. SQL> explain plan for select empno,ename from emp

2. where empno > 7876 order by empno;

3. Query Plan

4. SELECT STATEMENT [CHOOSE] Cost=1

5. TABLE ACCESS BY ROWID EMP [ANALYZED]

6. INDEX RANGE SCAN EMP_I1 [ANALYZED]

在非唯一索引上,谓词col = 5可能返回多行数据,所以在非唯一索引上都使用索引范围扫描。

使用index rang scan的3种情况:

(a) 在唯一索引列上使用了range操作符(> < <> >= <= between)

(b) 在组合索引上,只使用部分列进行查询,导致查询出多行

(c) 对非唯一索引列上进行的任何查询。

13:21:59 SQL> create index emp_deptno_ind on emp(deptno);

Index created.

13:22:23 SQL> select * from emp where deptno=10;

EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

7839 KING       PRESIDENT            17-NOV-81       5000                    10

7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

时间: 2024-09-03 12:02:53

Oracle索引扫描的4个类别的相关文章

Oracle 索引扫描的五种类型

Oracle 索引扫描的五种类型 (1)索引唯一扫描(INDEX UNIQUE SCAN) LHR@orclasm > set line 9999 LHR@orclasm > select * from scott.emp t where t.empno=10;   Execution Plan ---------------------------------------------------------- Plan hash value: 2949544139   -----------

oracle中,索引数据定位和索引扫描有什么区别?

问题描述 oracle中,索引数据定位和索引扫描有什么区别? oracle中,索引数据定位和索引扫描有什么区别? 是不是就是简单的扫描就是要扫完,定位只要查到就可以了? 解决方案 oracle索引扫描索引扫描高手闲谈Oracle索引扫描 解决方案二: http://blog.sina.com.cn/s/blog_54eeb5d90100q9zu.html 解决方案三: 索引数据定位和索引扫描 你说的应该是索引数据定位和全表扫描吧?如果用到索引的话,没必要进行扫描,可以通过二分法快速定位

《高并发Oracle数据库系统的架构与设计》一2.1 索引扫描识别

2.1 索引扫描识别 如果把我们的数据库比喻成一座图书馆,那表作为数据的载体,则是一本一本的图书,而索引则是图书的目录.目录不仅让图书阅读和查找变得方便,更是图书成败的关键. 也许有人会说,我翻阅的是一本杂志,内容本就不多,我甚至不需要目录.是的,Oracle数据库也考虑到了这一点,对于数据量很小的表,我们可以不建索引,在查询时可以进行全表扫描(FULL TABLE SCAN),这种方式对于小表来说更适合.但是,如果我们手上是一本大字典呢?你甚至一个人都搬不动它,当然你也不必像看杂志一样每页都去

关于Oracle 9i 跳跃式索引扫描(Index Skip Scan)的小测试

oracle|索引 在Oracle9i中我们知道能够使用跳跃式索引扫描(Index Skip Scan).然而,能利用跳跃式索引扫描的情况其实是有些限制的. 从Oracle的文档中我们可以找到这样的话: Index Skip ScansIndex skip scans improve index scans by nonprefix columns. Often, scanning index blocks is faster than scanning table data blocks.Sk

Oracle索引的三个问题

索引( Index )是常见的数据库对象,它的设置好坏.使用是否得当,极大地影响数据库应用程序和Database的性能.虽然有许多资料讲索引的用法,DBA和Developer 们也经常与它打交道,但笔者发现,还是有不少的人对它存在误解,因此针对使用中的常见问题,讲三个问题.此文所有示例所用的数据库是Oracle 8.1.7 OPS on HP N series,示例全部是真实数据,读者不需要注意具体的数据大小,而应注意在使用不同的方法后,数据的比较.本文所讲基本都是陈词滥调,但是笔者试图通过实际

Oracle索引的监控

Oracle索引的监控   一.1  BLOG文档结构图     一.2  前言部分   一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 掌握oracle中索引的监控方法 ② sys.col_usage$的初步了解     Tips: ① 本文在ITpub(http://blog.itpub.net/26736162)和博客园(http://www.cnblogs.com/lhrbest)有同步更新 ②

Oracle索引分裂(Index Block Split)

Oracle索引分裂(Index Block Split) 索引分裂:index  block split : 就是索引块的分裂,当一次DML 事务操作修改了索引块上的数据,但是旧有的索引块没有足够的空间去容纳新修改的数据,那么将分裂出一个新的索引块,旧有块的部分数据放到新开辟的索引块上去. 分裂的类型:根节点分裂,分支节点分裂,叶节点分裂(最频繁发生,对性能影响最直接) 按照数据迁移量的比例,将索引分裂分为两种类型:9-1分裂和5-5分裂. 9-1分裂:绝大部分数据还保留在旧有节点上,仅有非常

ORACLE 索引和MYSQL INNODB 辅助索引对NULL的处理区别

ORACLE 索引和MYSQL INNODB 辅助索引对NULL的处理 我们清楚ORACLE中的b+索引是对键值的NULL进行存储的,以致于我们 IS NULL这种肯定是用不到索引的, 当然这提及的ORACLE表为堆表,索引为单列B+树索引,(有一种优化方式为建立组合索引如create index xx on tab(a,'1') 这样来保证索引记录NULL值 这样DUMP出来为 ..... row#11[7886] flag: ------, lock: 2, len=12 col 0; NU

续《表扫描与索引扫描返回的行数不一致》

续<表扫描与索引扫描返回的行数不一致> 上篇文章主要介绍了如何从分析表得到的报错,以及trace中的信息,判断表返回的记录与索引返回记录不一致时的处理方式.下面这篇文章则介绍了针对ORA-1499进行问题排查的一些基本方法. OERR: ORA-1499 table/Index Cross Reference Failure - see trace file (文档 ID 1499.1) Error: ORA 1499 Text: table/Index Cross Reference Fai