`
cd0281
  • 浏览: 123181 次
  • 性别: 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数据库调优配置

    Oracle数据库调优是提高数据库性能的关键技术,它涉及到多个层面,包括硬件配置、数据库结构、SQL查询优化、存储参数调整等。以下将详细介绍这两种调优方案,并涉及相关的Oracle数据库调优知识点。 一、物理硬件与...

    Oracle系统调优办法

    ### Oracle系统调优方法 #### 一、Oracle性能调优的重要性及目标 Oracle数据库作为业界领先的企业级数据库管理系统之一,在企业信息化建设中扮演着至关重要的角色。为了确保Oracle数据库能够高效稳定地运行,并且...

    Oracle Sql性能调优.ppt

    SQL 优化建议是 Oracle 调优的一个重要步骤,它涉及到 SQL 语句优化、索引使用优化、多表关联查询操作优化等。通过对 SQL 语句的优化,可以提高数据库的响应速度和吞吐量。 11. SQL 分析工具 SQL 分析工具是 ...

    高级owi与oracle性能调优

    - **使用SQL Tuning Advisor和SQL Access Advisor**:针对特定SQL语句提出调优建议。 - **处理死锁和锁争用**:分析v$lock视图,诊断和解决锁相关的问题。 - **分析和优化表空间的使用情况**:例如,使用表空间映射...

    Oracle性能调优

    - **ADDM(Automatic Database Diagnostic Monitor)**:自动数据库诊断监控器,基于AWR数据生成诊断报告,提供性能调优建议。 - **V$视图**:Oracle 提供了大量的动态性能视图(V$ Views),这些视图包含了关于...

    Oracle 性能调优向导

    Oracle数据库性能调优是数据库管理员和开发人员的关键技能之一,尤其在处理大数据量、高并发的业务场景下显得尤为重要。"Oracle性能调优向导"这本书旨在为读者提供全面而实用的Oracle性能优化策略和技巧。 一、...

    Oracle性能调优讲解

    以下是一些重要的实践建议: - **表的设计**:合理设计表结构,采用适当的索引策略。 - **索引的使用**:创建必要的索引以加速查询,同时避免过度索引导致的维护成本增加。 - **回滚段和重做日志**:根据并发事务量...

    Oracle数据库编程调优手册

    Oracle数据库编程调优手册是一本针对数据库开发者和管理员的重要参考资料,旨在帮助他们提升Oracle数据库的性能和效率。手册涵盖了多个关键领域,包括数据加载优化、UPDATE语句的优化、DELETE操作的改进、DBA级别的...

    ORACLE 19C SQL调优指南 中文版 Oracle DBA

    13. **SQL优化工具**:Oracle提供了一些内置工具,如SQL Tuning Advisor和Automatic Workload Repository (AWR),它们可以帮助识别性能问题并提出优化建议。 Oracle 19C SQL调优是一门深入且实践性强的学问,需要...

    oracle性能调优总结大全

    Oracle 性能调优大全 Oracle 是一个功能强大的关系数据库管理系统,但是随着数据库的增长,性能问题开始变得越来越重要。为此,我们需要对 Oracle 进行性能调优,以提高数据库的响应速度和效率。下面是 Oracle ...

    Oracle 19C SQL调优指南 中文版 DBA优化利器

    《Oracle 19C SQL调优指南》是针对Oracle数据库管理员(DBA)的重要参考资料,尤其适合那些希望提升SQL性能的专业人士。SQL调优是数据库管理中的核心技能,它关乎到系统的响应时间、资源利用率和整体性能。Oracle 19C...

    Oracle数据库查询调优

    ### Oracle数据库查询调优知识点详解 #### 一、概述 在Oracle数据库中,查询调优是提高系统性能的关键环节之一。随着数据量的增长和技术的进步,优化查询变得日益重要。本篇将详细介绍如何识别问题、收集数据、分析...

    oracle内部调优培训

    Oracle内部调优培训主要涉及数据库性能优化的各种策略和技术,这些技术旨在提高数据库系统的效率和响应时间,确保系统能够处理大量的并发事务和数据操作。以下是一些关键知识点: 1. **性能调整**:性能调整是...

    oracle sql调优新思维

    3. **ORACLE的优化器**:Oracle数据库内置了一个智能优化器,它负责选择最佳的执行计划。优化器根据统计信息和成本模型来决定最佳路径。理解优化器的工作原理,可以让我们更好地利用 hints 或者其他手段影响优化器的...

    oracle sql调优原则

    ### Oracle SQL调优原则 #### 一、使用索引的重要性 - **索引与全表扫描的对比**:虽然在某些特殊情况下,使用索引可能会稍微慢于全表扫描,但这通常只存在于同一数量级上的差异。而在大多数情况下,使用索引能够...

    Oracle性能调优技术内幕

    ### Oracle性能调优技术内幕 #### 一、优化语录与原则 1. **优化一点总比什么都不做强**:在数据库性能调优过程中,即便是最小的改进也能带来显著的效果。 2. **没有任何东西可以替代最佳的SQL语句**:编写高效、...

    oracle公司调优培训.ppt

    - **SQL调优顾问**:使用Oracle的内置工具进行SQL优化建议。 3. **存储结构优化**: - **表和分区设计**:选择合适的表空间、段、区、块大小,以及分区策略(范围、列表、哈希等)。 - **表压缩**:了解Oracle的...

    oracle实例调优

    ### Oracle实例调优知识点 #### 一、Oracle实例概述 Oracle数据库系统中的一个实例是指一组内存结构和进程,这些内存结构和进程共同管理一个物理数据库文件。实例是数据库的一个运行时映像,它包含了用于访问数据库...

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

    本文主要探讨了在Oracle数据库性能优化实践中的一些心得,重点关注等待事件和操作系统层面的问题。 首先,文章指出现在的性能优化策略已经转向优化等待事件,即关注数据库在执行过程中遇到的等待问题。这些等待事件...

Global site tag (gtag.js) - Google Analytics