`
paldosfan
  • 浏览: 29404 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle索引扫描四大类

阅读更多
http://database.51cto.com/art/200911/162180.htm
这里介绍CBO根据统计数值得知进行全Oracle索引扫描比进行全表扫描更有效时,才进行全Oracle索引扫描,而且此时查询出的数据都必须从索引中可以直接得到。



学习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经常实现唯一性扫描。

使用唯一性约束的例子:

SQL> explain plan for 
select empno,ename from emp where empno=10; 
Query Plan 
SELECT STATEMENT [CHOOSE] Cost=1
TABLE ACCESS BY ROWID EMP [ANALYZED] 
INDEX UNIQUE SCAN EMP_I1
(2) 索引范围扫描(index range scan)

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

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

SQL> explain plan for select empno,ename from emp 
where empno > 7876 order by empno; 
Query Plan 
SELECT STATEMENT [CHOOSE] Cost=1
TABLE ACCESS BY ROWID EMP [ANALYZED] 
INDEX RANGE SCAN EMP_I1 [ANALYZED]
在非唯一索引上,谓词col = 5可能返回多行数据,所以在非唯一索引上都使用索引范围扫描。

使用index rang scan的3种情况:
(a) 在唯一索引列上使用了range操作符(> < <> >= <= between)
(b) 在组合索引上,只使用部分列进行查询,导致查询出多行
(c) 对非唯一索引列上进行的任何查询。

(3) 索引全扫描(index full scan)

与全表扫描对应,也有相应的全Oracle索引扫描。在某些情况下,可能进行全Oracle索引扫描而不是范围扫描,需要注意的是全Oracle索引扫描只在CBO模式下才有效。 CBO根据统计数值得知进行全Oracle索引扫描比进行全表扫描更有效时,才进行全Oracle索引扫描,而且此时查询出的数据都必须从索引中可以直接得到。

全Oracle索引扫描的例子:

An Index full scan will not perform single block i/o's and so it may prove to be inefficient. 
e.g. 
Index BE_IX is a concatenated index on big_emp (empno, ename) 
SQL> explain plan for select empno, ename from big_emp order by empno,ename; 
Query Plan 
SELECT STATEMENT [CHOOSE] Cost=26
INDEX FULL SCAN BE_IX [ANALYZED]
(4) 索引快速扫描(index fast full scan)

扫描索引中的所有的数据块,与 index full scan很类似,但是一个显著的区别就是它不对查询出的数据进行排序,即数据不是以排序顺序被返回。在这种存取方法中,可以使用多块读功能,也可以使用并行读入,以便获得最大吞吐量与缩短执行时间。

索引快速扫描的例子:

SQL> explain plan for select empno,ename from big_emp; 
Query Plan 
SELECT STATEMENT [CHOOSE] Cost=1
INDEX FAST FULL SCAN BE_IX [ANALYZED] 
SQL> explain plan for select ename from big_emp; 
Query Plan 
SELECT STATEMENT [CHOOSE] Cost=1
INDEX FAST FULL SCAN BE_IX [ANALYZED]

【编辑推荐】

Oracle管理工具Oracle SQL Handler功能一览
高手闲谈Oracle索引扫描
六分钟学会Oracle全表扫描
代码讲解Oracle可选择性
闲谈Oracle执行计划的步骤顺序
分享到:
评论

相关推荐

    oracle四大宝典之四

    - **全表扫描、索引扫描与物理读**:选择合适的扫描方式,减少物理读取次数,提升查询性能。 - **DBWn与物理写**:管理后台写入进程,优化数据写入操作。 - **日志文件与归档日志**:合理配置日志文件和归档策略,...

    oracle常用sql整理

    SQL是标准化的查询语言,分为DDL(Data Definition Language)、DML(Data Manipulation Language)、TCL(Transaction Control Language)和DCL(Data Control Language)四大类。 1. DDL:定义数据结构,包括创建...

    oracle

    这可能包括使用索引、避免全表扫描、调整查询计划、使用绑定变量等。SQL调优的目标是减少查询时间,降低资源消耗,从而提升整体系统的响应速度。 最后,DBA,数据库管理员,是负责管理和维护Oracle数据库的专业人员...

    最全的ORACLE 9I基础手册

    3. 索引优化:合理创建和使用索引,避免全表扫描。 4. 资源管理:使用调度器和资源计划,控制不同用户和任务的资源使用。 Oracle 9i基础手册将引导初学者逐步了解并掌握这些概念和操作,为后续的Oracle数据库管理及...

    Oracle中SQL查询优化研究

    通过理解这些过程,我们可以针对性地优化SQL语句,如减少硬解析次数,选择合适的索引,避免全表扫描,合理使用并行查询等,以提高Oracle数据库的整体性能。 四、优化策略 1. 使用绑定变量:减少SQL语句的硬解析,...

    数据库mysql+oracle面试题

    - **去除Like语句的前导通配符**:使用`LIKE '%abc%'`这样的模式匹配会使得数据库无法有效地利用索引,从而导致全表扫描。尽量避免这种情况的发生。 - **去除Outer Join**:在可能的情况下,避免使用外连接,可以...

    sql语法教程

    它分为DDL(Data Definition Language)、DML(Data Manipulation Language)、TCL(Transaction Control Language)和DCL(Data Control Language)四大类。 1. DDL:负责定义和修改数据库结构,如创建表、视图、...

    ORALCE设计开发规范

    1. 避免全表扫描:使用索引,减少表扫描,提升查询速度。 2. 使用JOIN代替子查询:在合适的情况下,用JOIN操作替换子查询,降低查询复杂度。 3. 使用绑定变量:避免SQL注入,提高执行计划缓存的利用率。 4. 分析...

    java开发面试题 100页 20220709

    例如,使用合适的索引、避免全表扫描、减少JOIN操作、合理设计数据库表结构和字段类型等。 2. **SQL优化**:可以通过编写更高效的SQL语句、使用EXPLAIN分析查询计划、避免子查询、合并多次数据库访问等方法进行优化...

    MySQL基础知识以及简单练习题

    - **优化查询**:避免全表扫描,合理使用索引,避免在索引列上使用函数等。 6. **事务处理** - **事务的概念**:一组操作的集合,要么全部成功,要么全部失败。 - **事务的四大特性(ACID)**:原子性、一致性、...

    数据库SQL资料以及案例参考

    例如,避免全表扫描,使用合适的JOIN策略,减少子查询,优化索引设计,以及合理设置数据库参数等。 以上知识点是数据库SQL资料以及案例参考中可能涵盖的内容,通过深入学习和实践这些概念,你可以提高SQL编程能力,...

    数据库 MySQL入门教程

    优化查询包括合理使用索引、避免全表扫描、减少JOIN操作、优化子查询等策略。 7. 视图与存储过程 视图是虚拟表,基于一个或多个表的查询结果,可以简化复杂的查询并提供安全性。存储过程是一组预编译的SQL语句,...

    SQL语句教程.zip_SQL语句_很好的SQL语句教程

    SQL语句主要分为四大类:DQL(Data Query Language)、DDL(Data Definition Language)、DML(Data Manipulation Language)和DCL(Data Control Language)。 二、SQL基本操作 1. DDL:用于定义数据库结构。例如...

    面试总结2019年9月3日.doc

    9. **何时不会使用索引**:全表扫描时,如使用了NOT IN, NOT EXISTS, OR条件且未优化,或者使用了函数操作索引字段,可能导致索引失效。 10. **Mybatis动态代理的实现**:Mybatis使用JDK动态代理或CGLIB动态代理,...

    2008、2009四级数据库真题

    - 主要分类包括关系型数据库(如MySQL、Oracle)、非关系型数据库(如MongoDB、Redis)以及分布式数据库等。 2. 关系数据库模型: - 关系数据库基于关系理论,其中每个数据表代表一个实体,而表之间的关系通过...

    sql学习资料免费下载

    16. **SQL性能优化**:包括选择合适的数据类型、避免全表扫描、合理使用索引、减少JOIN操作等策略。 17. **SQL注入**:一种常见的安全漏洞,通过输入恶意SQL代码来获取未授权的数据。学习SQL时应了解如何防止这种...

    本人精心整理sql基础

    SQL分为四大类:DQL(Data Query Language),用于查询数据;DDL(Data Definition Language),用于定义数据库结构;DML(Data Manipulation Language),用于操作数据;以及DCL(Data Control Language),用于...

Global site tag (gtag.js) - Google Analytics