ORACLE SQL性能优化系列 (二)

原创 2004年09月16日 08:45:00

4. 选择最有效率的表名顺序(只在基于规则的优化器中有效)

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.

 

例如:

     TAB1 16,384 条记录

     TAB2 1      条记录

 

     选择TAB2作为基础表 (最好的方法)

     select count(*) from tab1,tab2   执行时间0.96

    

    选择TAB2作为基础表 (不佳的方法)

     select count(*) from tab2,tab1   执行时间26.09

 

如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.

 

例如:

 

   EMP表描述了LOCATION表和CATEGORY表的交集.

 

 SELECT *

FROM LOCATION L ,

      CATEGORY C,

      EMP E

WHERE E.EMP_NO BETWEEN 1000 AND 2000

AND E.CAT_NO = C.CAT_NO

AND E.LOCN = L.LOCN

 

将比下列SQL更有效率

 

SELECT *

FROM EMP E ,

LOCATION L ,

      CATEGORY C

WHERE  E.CAT_NO = C.CAT_NO

AND E.LOCN = L.LOCN

AND E.EMP_NO BETWEEN 1000 AND 2000

 

 

5.       WHERE子句中的连接顺序.

 

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

 

例如:

 

(低效,执行时间156.3)

SELECT …

FROM EMP E

WHERE  SAL > 50000

AND    JOB = ‘MANAGER’

AND    25 < (SELECT COUNT(*) FROM EMP

             WHERE MGR=E.EMPNO);

 

(高效,执行时间10.6)

SELECT …

FROM EMP E

WHERE 25 < (SELECT COUNT(*) FROM EMP

             WHERE MGR=E.EMPNO)

AND    SAL > 50000

AND    JOB = ‘MANAGER’;

 

 

6.     SELECT子句中避免使用 ‘ * ‘

当你想在SELECT子句中列出所有的COLUMN,使用动态SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.

   

 

7.     减少访问数据库的次数

当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量.

 

例如,

    以下有三种方法可以检索出雇员号等于03420291的职员.

 

方法1 (最低效)

    SELECT EMP_NAME , SALARY , GRADE

    FROM EMP

    WHERE EMP_NO = 342;

    

    SELECT EMP_NAME , SALARY , GRADE

    FROM EMP

    WHERE EMP_NO = 291;

 

方法2 (次低效)

   

    DECLARE

        CURSOR C1 (E_NO NUMBER) IS

        SELECT EMP_NAME,SALARY,GRADE

        FROM EMP

        WHERE EMP_NO = E_NO;

    BEGIN

        OPEN C1(342);

        FETCH C1 INTO …,..,.. ;

        …..

        OPEN C1(291);

       FETCH C1 INTO …,..,.. ;

         CLOSE C1;

      END;

 

 

 

 

 

方法3 (高效)

 

    SELECT A.EMP_NAME , A.SALARY , A.GRADE,

            B.EMP_NAME , B.SALARY , B.GRADE

    FROM EMP A,EMP B

    WHERE A.EMP_NO = 342

    AND   B.EMP_NO = 291;

 

 

注意:

    SQL*Plus , SQL*FormsPro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200

 

(摘錄自csdn)

oracle性能优化三——数据库系统优化之toad监控

在我上一篇博客《oracle性能优化二——操作系统优化》中介绍了如何操作系统优化,本文将介绍如何使用toad监控数据库的优化。      通过合理的分配内存大小,合理的设置表空间体系和内部空间参数。可...
  • tang_huan_11
  • tang_huan_11
  • 2015年09月24日 14:28
  • 4333

高级SQL优化(二) ——《12年资深DBA教你Oracle开发与优化——性能优化部分》

充分利用索引 索引的限制 1. 索引对不等号和NOT的限制   如果WHERE条件中出现!=或者 Oracle 10g起,在基于CBO的优化器模式下Oralce会进行自动优...
  • holandstone
  • holandstone
  • 2016年05月21日 23:36
  • 1788

ORACLE SQL性能优化汇总

ORACLE SQL性能优化汇总:SQL语句共享、ORACLE SQL 多表联合查询、where语句条件顺序、ORACEL多表连接查询指定表别名alias等...
  • tianwei7518
  • tianwei7518
  • 2015年03月11日 23:41
  • 958

Oracle 11g 中SQL性能优化新特性之SQL性能分析器(SQLPA)

本文通过简单的例子,完整而详细的说明了oracle11g中新特点——SQLPA的使用,该功能在实际工作中有着非常广泛的实用价值,尤其在数据库升级和迁移过程中,非常有用,现整理记录于此,以供大家学习和今...
  • LHDZ_BJ
  • LHDZ_BJ
  • 2015年12月09日 16:48
  • 819

Oracle性能优化图文详解——利用第三方工具

开发中或者是正在运行的系统性能显著恶化的场合,需要进行性能优化。当听到性能优化时,有些人可能会感觉到非常困难,如果使用OB的话,通过使用索引或者内存等可以非常简单的进行性能优化。这篇文章将要介绍怎样使...
  • xiaohaiyaoer
  • xiaohaiyaoer
  • 2013年07月17日 16:20
  • 2372

Oracle分页查询性能优化

对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如 此之多,就不得不对数据进行分页处理。常常用户并不是对所有数据都感兴趣的,或者大部分情 况下,他们只看前几页。 通...
  • sunansheng
  • sunansheng
  • 2016年09月19日 16:10
  • 13499

Oracle查询性能优化(面试题:数据库查询优化也是常问的问题)

原则一:注意WHERE子句中的连接顺序:  ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WH...
  • hxpjava1
  • hxpjava1
  • 2017年02月21日 11:40
  • 1146

Oracle 数据库性能优化3日实战(企业培训)

课程名称一: Oracle性能优化及调整 课程时长 1天 课程深度: 高级 上机实验: 10%-30% 授课对象: Oracle开发人员、Oracle数据库管理人员,应用程序开发人员 课程描述...
  • robinson_0612
  • robinson_0612
  • 2017年04月05日 11:49
  • 2325

12年资深DBA教你Oracle开发与优化——性能优化部分

http://sishuok.com/forum/blogPost/list/6366.html#22766 Oracle数据完整性和锁机制——《12年资深DBA教你Oracle开发与优化——性能优...
  • rainyear
  • rainyear
  • 2013年07月17日 10:14
  • 1127

PL/SQL性能优化技巧

1、理解执行计划 1-1.什么是执行计划     Oracle数据库在执行sql语句时,oracle的优化器会根据一定的规则确定sql语句的执行路径,以确保sql语句能以最优性能执行.在oracle...
  • sinat_16382631
  • sinat_16382631
  • 2016年10月04日 17:23
  • 730
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORACLE SQL性能优化系列 (二)
举报原因:
原因补充:

(最多只允许输入30个字)