知识大全 oracle数据库sql的优化总结

Posted 索引

篇首语:胸怀万里世界, 放眼无限未来。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 oracle数据库sql的优化总结相关的知识,希望对你有一定的参考价值。

  自己对oracle sql的一些优化总结 自己也记录下来 也希望对大家有帮助

  一 使用where少使用having;

  二 查两张以上表时 把记录少的放在右边;

  三 减少对表的访问次数;

  四 有where子查询时 子查询放在最前;

  五 select语句中尽量避免使用*(执行时会把*依次转换为列名);

  六 尽量多的使用mit;

  七 Decode可以避免重复扫描相同的记录或重复连接相同的表;

  八 通过内部函数也可提高sql效率;

  九 连接多个表时 使用别名并把别名前缀于每个字段上;

  十 用exists代替in

  十一 not exists代替 not in(not in 字句将执行一个内部的排序和合并 任何情况下 not in是最低效的 子查询中全表扫描了 为了避免使用not in 可以改写成outer joins或not exists);

  十二 表连接比exists更高效;

  十三 用exists替换distinct

  例

  低                                                                                                                                                         高

  select distinct dept_no dept_name                                                                                    select dept_no dept_name

  from dept d emp e                                                                                                                  from dept d

  where d dept_no = e dept_no;                                                                                               where exists (select from emp e where e dept_no = d dept_no);

  十四 使用TKPROF工具来查询sql性能状态;

  十五 用索引提高效率(代价是 索引需要空间 而且定期重构索引很有必要 ALTER INDEX REBUILD

  先介绍下索引的原理 方便接下来对索引的优化的理解

  通过索引找到rowid 然后通过rowid访问表 但如果查询的列包括在index中 将不在执行第二部操作 因为检索数据保存在索引中 单单访问索引就可以完全满足查询要求

  前提提要 在十六例中 LODGING列有唯一索引;MANAGER列上有非唯一性索引

  十六 索引范围查询(INDEX RANGE SACEN):

  适用于两种情况

   )基于一个范围的查询

  SELECT LODGING FROM LODGING WHERE LODGING LIKE M%

  (where字句条件包括一系列的值 oracle将通过索引范围查询方式查询LODGING_PK)

   ) 基于非唯一性索引的检索

  SELECT LODGING FROM LODGING WHERE MANAGER = LI ;

  (此查询分两步 LODGING$MANAGER的索引范围查询得到所有符合条件记录的rowid 然后通过rowid访问表得到LODGING列的值 该索引为非唯一性索引 数据库不能对它执行索引唯一扫描)

  where字句中 如果索引列所对应的值的第一个字符由通配符开始 索引将不被采用 而会全表扫描 如 SELECT WHERE MANAGER LIKE %LI

  十七 基础表的选择

  基础表 最先访问的表(通常以全表扫描的方式被访问)

  根据优化器的不同 SQL语句中基础表的选择是不一样的

  如果使用CBO 优化器会检查SQL语句中的每个表的物理大小 索引的状态 然后选用话费最低的路径

  如果使用RBO 并且所有的连接条件都有索引对应 这种情况下基础表就是FROM字句中列在最后的表

  例

  SELECT A NAME B MANAGER FROM WOKER A LODGING B WHERE A LODGING = B LODGING;

  由于LODGING列上有一个索引 而且WORKER表中没有相比较的索引 WORKER表将被作为查询基础表

  十八 多个平等的索引

  当SQL语句的执行路径可以使用分布在多个表上的多个索引时 oracle会同事使用多个索引并在运行时对它们的记录合并 检索仅对全部索引有效的记录

  oracle选择执行路径是 唯一索引等级高于非唯一索引 只有当where字句中索引列和常量比较才有效 如果索引列和其它表的索引列相比较 这种字句在优化器中等级非常低;

  如果不同表中两个相同等级的索引将被引用 根据FROM字句中表的顺序决定哪个先被使用 FROM字句中最后的表索引优先级高 如果相同表中两个相同等级的索引将被引用 where字句中最先被引用的索引将有最高的优先级

  例 DEPTNO上有非唯一性索引 EMP_CAT也有非唯一性索引

  SELECT ENAME FROM EMP WHERE DEPT_NO = AND EMP_CAT = A ;

  DEPTNO索引将被先检索 然后同EMP_CAT索引检索出的结果合并 执行路径如下

  TABLE ACCESS BY ROWID ON EMP

  AND _EQUAL

  INDEX RANGE SCAN ON DEPT_IDX

  INDEX RANGE SCAN ON CAT_IDX

  十九 等式比较与范围比较

  先上例子

  SELECT ENAME FROM EMP WHERE DEPT_NO > AND EMP_CAT = A ;

  (在两个非唯一性索引前提下)此时范围索引不被使用 通过EMP_CAT索引查询出记录再与DEPT_NO条件进行比较

  注意 唯一性所以做范围比较时 等级要比非唯一性索引的等式比较低;

  二十 强制索引失效

  如果两个或两个以上索引具有相同的等级 可以强制命令oracle优化器使用其中的一个 那何时使用此种策略呢?如果一个索引已接近于唯一 而另一索引有很多重复的值 排序与合并反而会成为负担 此时可以屏蔽后者使其索引失效

cha138/Article/program/Oracle/201311/19042

相关参考

知识大全 Oracle中优化SQL的原则

Oracle中优化SQL的原则  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  已经检验的语句和已

知识大全 ORACLE优化SQL语句,提高效率(2)

ORACLE优化SQL语句,提高效率(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  索引是

知识大全 ORACLE SQL性能优化系列 (十三)

ORACLESQL性能优化系列(十三)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  用WHER

知识大全 ORACLE SQL性能优化系列 (三)

ORACLESQL性能优化系列(三)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  使用DECO

知识大全 Oracle SQL性能优化系列学习三

OracleSQL性能优化系列学习三  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!正在看的ORAC

知识大全 数据库内存参数调优技术的总结

  近来公司技术研发都在问我关于内存参数如何设置可以优化Oracle的性能所以抽时间整理了这篇文档以做参考  目的:  希望通过整理此文档使公司同事对oracle内存结构有一个全面的了解并在实际的工作

知识大全 Oracle数据库编程动态SQL

Oracle数据库编程动态SQL  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  动态SQL  编

知识大全 ORACLE数据库性能优化概述

ORACLE数据库性能优化概述  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  实际上为了保证OR

知识大全 Oracle数据库系统性能优化策略

Oracle数据库系统性能优化策略  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一个数据库系统

知识大全 Oracle数据库PL/SQL介绍

Oracle数据库PL/SQL介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  什么是PL/S