• λ我爱Aspx >> C#.Net >> ORACLE优化器 _数据库技巧
  • ORACLE优化器 _数据库技巧

  • :aspxer  Դ:internet  :2007-4-28 23:46:48  ؼ:数据库,数据
  • 表 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的工作量.

    例如,

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

    Ҷƪл˵?
  • һƪWindows 2000下优化Oracle9i性能_数据库技巧
    һƪ优化Oracle库表设计的若干方法_数据库技巧