`
cd0281
  • 浏览: 120360 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

oracle的一些调优建议(3)

阅读更多
15. 用NOT EXISTS替代NOT IN

在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).  为了避免使用NOT IN ,我们可以把它改写成NOT EXISTS.
 例如:
SELECT …
FROM EMP
WHERE DEPT_NO NOT IN (SELECT DEPT_NO 
                         FROM DEPT 
                         WHERE DEPT_CAT=’A’);

为了提高效率.改写为:
SELECT ….
FROM EMP E
WHERE NOT EXISTS (SELECT ‘X’ 
                    FROM DEPT D
                    WHERE D.DEPT_NO = E.DEPT_NO
                    AND DEPT_CAT = ‘A’); 


16.用表连接替换EXISTS

通常来说 , 采用表连接的方式比EXISTS更有效率
     
SELECT ENAME
      FROM EMP E
      WHERE EXISTS (SELECT ‘X’ 
                      FROM DEPT
                      WHERE DEPT_NO = E.DEPT_NO
                      AND DEPT_CAT = ‘A’);
    
      (更高效)
     
SELECT ENAME
      FROM DEPT D,EMP E
      WHERE E.DEPT_NO = D.DEPT_NO
      AND DEPT_CAT = ‘A’ ;



17.用EXISTS替换DISTINCT


当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换
 例如:
低效:
   
SELECT DISTINCT DEPT_NO,DEPT_NAME
    FROM DEPT D,EMP E
    WHERE D.DEPT_NO = E.DEPT_NO

高效:
   
SELECT DEPT_NO,DEPT_NAME
    FROM DEPT D
    WHERE EXISTS ( SELECT ‘X’
                    FROM EMP E
                    WHERE E.DEPT_NO = D.DEPT_NO);

  EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.


18.用索引提高效率

索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.
除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率.
虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来
存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.
注:
定期的重构索引是有必要的.
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>


19. 索引的操作

ORACLE对索引有两种访问模式.
1. 索引唯一扫描 ( 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’;



2. 索引范围查询(INDEX RANGE SCAN)
      适用于两种情况:
       基于一个范围的检索
       基于非唯一性索引的检索
例1:
     
SELECT LODGING
      FROM  LODGING
WHERE LODGING LIKE ‘M%’;

WHERE子句条件包括一系列值, ORACLE将通过索引范围查询的方式查询LODGING_PK . 索引范围查询将返回一组值, 它的效率要比索引唯一扫描低一些.


19. 索引的操作

例2:
     
SELECT LODGING
      FROM  LODGING
WHERE MANAGER = ‘BILL GATES’;

   这个SQL的执行分两步, LODGING$MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LODGING列的值. 由于LODGING$MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描.
  由于SQL返回LODGING列,而它并不存在于LODGING$MANAGER索引中, 所以在索引范围查询后会执行一个通过ROWID访问表的操作.
  WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用.
SELECT LODGING
      FROM  LODGING
WHERE MANAGER LIKE ‘%HANMAN’;

在这种情况下,ORACLE将使用全表扫描.

21.避免在索引列上使用计算

WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
举例:
低效:
SELECT …
FROM DEPT
WHERE SAL * 12 > 25000;

高效:
SELECT …
FROM DEPT
WHERE SAL  > 25000/12;

译者按:
这是一个非常实用的规则,请务必牢记


22.自动选择索引


如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性.
在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引.
举例:
SELECT ENAME
FROM EMP
WHERE EMPNO = 2326  
AND DEPTNO  = 20 ;

这里,只有EMPNO上的索引是唯一性的,所以EMPNO索引将用来检索记录.
TABLE ACCESS BY ROWID ON EMP
       INDEX UNIQUE SCAN ON EMP_NO_IDX 



23.避免在索引列上使用NOT

通常, 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的
影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.
   举例:
   低效: (这里,不使用索引)
  
SELECT …
   FROM DEPT
   WHERE DEPT_CODE NOT <= 0;
  
   高效: (这里,使用了索引)
 
SELECT …
   FROM DEPT
   WHERE DEPT_CODE > 0;
  
需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符.
  
NOT >  to  <=
   NOT >=  to  <
   NOT <  to  >=
   NOT <=  to  >




分享到:
评论

相关推荐

    Oracle性能调优实践中的几点心得

    当应用管理员向我们通告现在应用很慢、数据库很慢的时侯,我们到数据库时做几个示例的Select也发现同样的问题时,有些时侯我们会无从下手,因为我们认为数据库的各种命种率都是满足Oracle文档的建议。

    oracle性能调优

    让Oracle跑得更快__Oracle_10g性能分析与优化主要针对oracle性能调优进行详细分析。并且该文档提供了很好的oracle性能优化建议。

    Oracle调优之初始化参数说明及建议

    Oracle调优之初始化参数说明及建议,很有用的数据库优化参考文档.供初级的朋友数据库调优参考.要上dba道路,从这里看起

    oracle游标溢出调优

    oracle游标溢出调优着眼点枚举。通过对相关数据字典和参数的分析,给出建议。

    Oracle管理艺术 中文版

    *以oracle公司提供的建议为主、关系型数据库的理论为辅,学习oracle数据库的工作原理。 *真正熟悉sga的内涵,进而提升oracle服务器的性能。 *像协奏曲那样,让oracle数据库相关文件彼此正常且有效率地分工协作。 *...

    Oracle sql 优化实例

    不错的东东,通俗易懂,建议学习.赶紧下载吧

    ORACLE19c数据库性能优化说明.docx

    orcale的sql调优

    数据库性能调优技术1索引调优.pdf

    数据库性能调优技术1索引调优,详细讲述了关于索引调优的方法建议

    Oracle AWR报告深入分析

    4、建议有兴趣的同学去学习一下 oracle plsql 编写技巧,能在 plsql 缩写技能与编程 思想上有所提升。 5、Awr 二个包的代码极其复杂,对学习者的 plsql 编写能力有要求。 6、对应的二个包还包括 ADDM,ASH 的源码,...

    Oracle Wait Interface性能诊断与调整实践指南

    oracle数据库的经典调优文档,建议dba深入阅读

    Oracle10,11g 巡检,调优。

    86.超过2g的segment(单个表超过2g建议使用分区表) 87.数据库长事务(执行超过6s) 88.产生大量物理读的进程 89.产生归档日志过快的进程 90.等待事件对应的sql语句 91.占用大量temp表空间的session和sql监控 92....

    DBA浅谈Oracle__EBS11i系统性能优化_U

    下面将在 Hardware (Server)、Disk I/O、Application、Oracle Database 提出 了一系列优化建议。本文档将对相关技术细节进行总结。 文档将包括如下主要内容: z Oracle Database 性能数据收集、分析和调优方法 z ...

    oracle_rac日常基本维护命令

    oracle rac日常基本维护命令 2 Oracle RAC性能调整 12 详解Oracle RAC入门和提高 27 ORACLE RAC数据库配置Dataguard环境 49 老白对于RAC应用调优的建议 51

    Spotlight_On_Oracle

    图形化、实时显示 Oracle Instance的活动状态 利用数据流、图形、颜色和声音等方式报警,识别系统问题 显示有关问题的详细信息,如活动的 Sessions、资源消耗大的SQL语句、Disk I/O以及...内置调优建议 与其它模块集成

    Oracle_Database_11g完全参考手册.part3/3

    通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 ...

    Oracle_Database_11g完全参考手册.part2/3

    通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 ...

    Toad_for_OracleV11常见疑问解答与常用技巧V1.0

    以下对TOAD有关疑问解答和技巧描述都是基于Toad for Oracle Xpert(Version 11.6.1.6,Toad for Oracle Xpert是Toad调优版,包括了专业版全部功能。额外增加了SQL调优功能。),如果与大家在实际工作中遇到情况有所...

    Oracle Wait Interface性能诊断与调整实践指南-中文版

    适合有一定oracle运维经验的人看的一本调优的好书,建议阅读。

    RHEL5.4+ORACLE11G+WEBLOGIC10.3集群安装部署手册

    详细讲述RHEL5.4+ORACLE11G+WEBLOGIC10.3各自安装步骤和集群步骤...包括资源中心系统部署结构,整体部署方案,性能调优建议三大部分,图文并茂,有详细步骤截图.非常适合初学者学习,也适合有一经验的工作者作为技术参考资料

    Oracle性能优化.doc

    Oracle性能优化是针对数据优化的一些方法和建议,里面讲解的很详细,从为什么要优化,讲到缓存,连接池,SGA,SQL调优,优化器等等。。对于有这方面需求的朋友来说,很有帮助的,也是很难得的。

Global site tag (gtag.js) - Google Analytics