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执行计划的步骤顺序
分享到:
相关推荐
- **全表扫描、索引扫描与物理读**:选择合适的扫描方式,减少物理读取次数,提升查询性能。 - **DBWn与物理写**:管理后台写入进程,优化数据写入操作。 - **日志文件与归档日志**:合理配置日志文件和归档策略,...
SQL是标准化的查询语言,分为DDL(Data Definition Language)、DML(Data Manipulation Language)、TCL(Transaction Control Language)和DCL(Data Control Language)四大类。 1. DDL:定义数据结构,包括创建...
这可能包括使用索引、避免全表扫描、调整查询计划、使用绑定变量等。SQL调优的目标是减少查询时间,降低资源消耗,从而提升整体系统的响应速度。 最后,DBA,数据库管理员,是负责管理和维护Oracle数据库的专业人员...
3. 索引优化:合理创建和使用索引,避免全表扫描。 4. 资源管理:使用调度器和资源计划,控制不同用户和任务的资源使用。 Oracle 9i基础手册将引导初学者逐步了解并掌握这些概念和操作,为后续的Oracle数据库管理及...
通过理解这些过程,我们可以针对性地优化SQL语句,如减少硬解析次数,选择合适的索引,避免全表扫描,合理使用并行查询等,以提高Oracle数据库的整体性能。 四、优化策略 1. 使用绑定变量:减少SQL语句的硬解析,...
- **去除Like语句的前导通配符**:使用`LIKE '%abc%'`这样的模式匹配会使得数据库无法有效地利用索引,从而导致全表扫描。尽量避免这种情况的发生。 - **去除Outer Join**:在可能的情况下,避免使用外连接,可以...
它分为DDL(Data Definition Language)、DML(Data Manipulation Language)、TCL(Transaction Control Language)和DCL(Data Control Language)四大类。 1. DDL:负责定义和修改数据库结构,如创建表、视图、...
1. 避免全表扫描:使用索引,减少表扫描,提升查询速度。 2. 使用JOIN代替子查询:在合适的情况下,用JOIN操作替换子查询,降低查询复杂度。 3. 使用绑定变量:避免SQL注入,提高执行计划缓存的利用率。 4. 分析...
例如,使用合适的索引、避免全表扫描、减少JOIN操作、合理设计数据库表结构和字段类型等。 2. **SQL优化**:可以通过编写更高效的SQL语句、使用EXPLAIN分析查询计划、避免子查询、合并多次数据库访问等方法进行优化...
- **优化查询**:避免全表扫描,合理使用索引,避免在索引列上使用函数等。 6. **事务处理** - **事务的概念**:一组操作的集合,要么全部成功,要么全部失败。 - **事务的四大特性(ACID)**:原子性、一致性、...
例如,避免全表扫描,使用合适的JOIN策略,减少子查询,优化索引设计,以及合理设置数据库参数等。 以上知识点是数据库SQL资料以及案例参考中可能涵盖的内容,通过深入学习和实践这些概念,你可以提高SQL编程能力,...
优化查询包括合理使用索引、避免全表扫描、减少JOIN操作、优化子查询等策略。 7. 视图与存储过程 视图是虚拟表,基于一个或多个表的查询结果,可以简化复杂的查询并提供安全性。存储过程是一组预编译的SQL语句,...
SQL语句主要分为四大类:DQL(Data Query Language)、DDL(Data Definition Language)、DML(Data Manipulation Language)和DCL(Data Control Language)。 二、SQL基本操作 1. DDL:用于定义数据库结构。例如...
9. **何时不会使用索引**:全表扫描时,如使用了NOT IN, NOT EXISTS, OR条件且未优化,或者使用了函数操作索引字段,可能导致索引失效。 10. **Mybatis动态代理的实现**:Mybatis使用JDK动态代理或CGLIB动态代理,...
- 主要分类包括关系型数据库(如MySQL、Oracle)、非关系型数据库(如MongoDB、Redis)以及分布式数据库等。 2. 关系数据库模型: - 关系数据库基于关系理论,其中每个数据表代表一个实体,而表之间的关系通过...
16. **SQL性能优化**:包括选择合适的数据类型、避免全表扫描、合理使用索引、减少JOIN操作等策略。 17. **SQL注入**:一种常见的安全漏洞,通过输入恶意SQL代码来获取未授权的数据。学习SQL时应了解如何防止这种...
SQL分为四大类:DQL(Data Query Language),用于查询数据;DDL(Data Definition Language),用于定义数据库结构;DML(Data Manipulation Language),用于操作数据;以及DCL(Data Control Language),用于...