知识大全 Oracle语句优化规则汇总(5)
Posted 索引
篇首语:敏而好学,不耻下问。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle语句优化规则汇总(5)相关的知识,希望对你有一定的参考价值。
Oracle语句优化规则汇总(5) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Oracle语句优化规则汇总( ) ()
Oracle语句优化规则汇总( )()
Oracle语句优化规则汇总( )()
Oracle语句优化规则汇总( )()
用EXPLAIN PLAN 分析SQL语句
EXPLAIN PLAN 是一个很好的分析SQL语句的工具 它甚至可以在不执行SQL的情况下分析语句 通过分析 我们就可以知道ORACLE是怎么样连接表 使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称
你需要按照从里到外 从上到下的次序解读分析的结果 EXPLAIN PLAN分析的结果是用缩进的格式排列的 最内部的操作将被最先解读 如果两个操作处于同一层中 带有最小操作号的将被首先执行
NESTED LOOP是少数不按照上述规则处理的操作 正确的执行路径是检查对NESTED LOOP提供数据的操作 其中操作号最小的将被最先处理
通过实践 感到还是用SQLPLUS中的SET TRACE 功能比较方便
举例
SQL> list SELECT * FROM dept emp * WHERE emp deptno = dept deptnoSQL> set autotrace traceonly /*traceonly 可以不显示执行结果*/SQL> / rows selected Execution Plan SELECT STATEMENT Optimizer=CHOOSE NESTED LOOPS TABLE ACCESS (FULL) OF EMP TABLE ACCESS (BY INDEX ROWID) OF DEPT INDEX (UNIQUE SCAN) OF PK_DEPT (UNIQUE)Statistics recursive calls db block gets consistent gets physical reads redo size bytes sent via SQL*Net to client bytes received via SQL*Net from client SQL*Net roundtrips to/from client sorts (memory) sorts (disk) rows processed
通过以上分析 可以得出实际的执行步骤是
TABLE ACCESS (FULL) OF EMP
INDEX (UNIQUE SCAN) OF PK_DEPT (UNIQUE)
TABLE ACCESS (BY INDEX ROWID) OF DEPT
NESTED LOOPS (JOINING AND )
注 目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN PLAN工具 也许喜欢图形化界面的朋友们可以选用它们
用索引提高效率
索引是表的一个概念部分 用来提高检索数据的效率 实际上 ORACLE使用了一个复杂的自平衡B tree结构 通常 通过索引查询数据比全表扫描要快 当ORACLE找出执行查询和Update语句的最佳路径时 ORACLE优化器将使用索引 同样在联结多个表时使用索引也可以提高效率 另一个使用索引的好处是 它提供了主键(primary key)的唯一性验证
除了那些LONG或LONG RAW数据类型 你可以索引几乎所有的列 通常 在大型表中使用索引特别有效 当然 你也会发现 在扫描小表时 使用索引同样能提高效率
虽然使用索引能得到查询效率的提高 但是我们也必须注意到它的代价 索引需要空间来存储 也需要定期维护 每当有记录在表中增减或索引列被修改时 索引本身也会被修改 这意味着每条记录的INSERT DELETE UPDATE将为此多付出 次的磁盘I/O 因为索引需要额外的存储空间和处理 那些不必要的索引反而会使查询反应时间变慢
定期的重构索引是有必要的
ALTER INDEX
索引的操作
ORACLE对索引有两种访问模式
索引唯一扫描 ( INDEX UNIQUE SCAN)
大多数情况下 优化器通过WHERE子句访问INDEX
例如
表LODGING有两个索引 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER
SELECT * FROM LODGING WHERE LODGING = ROSE HILL ;
在内部 上述SQL将被分成两步执行 首先 LODGING_PK 索引将通过索引唯一扫描的方式被访问 获得相对应的ROWID 通过ROWID访问表的方式执行下一步检索
如果被检索返回的列包括在INDEX列中 ORACLE将不执行第二步的处理(通过ROWID访问表) 因为检索数据保存在索引中 单单访问索引就可以完全满足查询结果
下面SQL只需要INDEX UNIQUE SCAN 操作
SELECT LODGING FROM LODGING WHERE LODGING = ROSE HILL ;
索引范围查询(INDEX RANGE SCAN)
适用于两种情况
基于一个范围的检索
基于非唯一性索引的检索
例
SELECT LODGING FROM LODGING WHERE LODGING LIKE M% ;
WHERE子句条件包括一系列值 ORACLE将通过索引范围查询的方式查询LODGING_PK 由于索引范围查询将返回一组值 它的效率就要比索引唯一扫描低一些
例
SELECT LODGING FROM LODGING WHERE MANAGER = BILL GATES ;
这个SQL的执行分两步 LODGING$MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LODGING列的值 由于LODGING$MANAGER是一个非唯一性的索引 数据库不能对它执行索引唯一扫描
由于SQL返回LODGING列 而它并不存在于LODGING$MANAGER索引中 所以在索引范围查询后会执行一个通过ROWID访问表的操作
WHERE子句中 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始 索引将不被采用 在这种情况下 ORACLE将使用全表扫描
cha138/Article/program/Oracle/201311/16878相关参考
Oracle语句优化规则汇总(10) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!需要当心的WHE
Oracle语句优化规则汇总(6) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!基础表的选择 基
30个Oracle语句优化规则详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 选用适合的Or
Oracle语句优化30个规则详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 选用适合的Or
Oracle维护常用SQL语句汇总 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如何远程判断O
ORACLE优化SQL语句,提高效率(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 索引是
以下是对oracle中的常用函数进行了汇总介绍需要的朋友可以过来参考下 一运算符算术运算符+*/可以在select语句中使用连接运算符||selectdeptno||dnamefromd
首先要声明两个知识点 ()RBO&CBO Oracle有两种执行优化器一种是RBO(RuleBasedOptimizer)基于规则的优化器这种优化器是基于sql语句写法选择执行路径的另
Oracle中优化SQL的原则 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 已经检验的语句和已
()选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名FROM子句中写在最后的表(基础表drivingtable)将被最先处理在