您当前的位置: 首页 >  性能优化

衣舞晨风

暂无认证

  • 2浏览

    0关注

    1156博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Oracle中SQL的性能优化

衣舞晨风 发布时间:2014-01-08 09:38:52 ,浏览量:2

【IT168技术文档】1、用EXISTS替代IN,NOT EXISTS替代NOT IN: 在子查询中,NOT在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下,使用EXISTS(或NOTEXISTS)通常将提高查询的效率.

    SELECT AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO 
       AND LOC = ‘MELB')
 
 

    2、用Where子句替换HAVING子句:     避免使用HAVING子句, HAVING只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作.如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.     例如:     低效: 

    SELECT REGION,AVG(LOG_SIZE)FROM LOCATION
    GROUP HAVING REGION REGION != ‘SYDNEY'
    AND REGION != ‘PERTH'

    高效 

    SELECT REGION,AVG(LOG_SIZE) FROM LOCATION
    WHERE REGION REGION != ‘SYDNEYBY REGION

    3、使用表的别名(Alias)

   当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

    4、用EXISTS替换DISTINCT

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

   低效:

    SELECT FROM DEPT D,EMP E
    WHERE D.DEPT_NO = E.DEPT_NO

    高效:

    SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE 10 UNION 

    低效:

   SELECT LOC_ID , LOC_DESC , REGION
   FROM LOCATION WHERE LOC_ID = 10
   OR LOC_ID = 30

     高效

    SELECT…
    FROM LOCATION WHERE LOC_IN IN (AND JOB = ‘MANAGER'
    AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);

    (高效,执行时间10.6秒)

   SELECT … FROM EMP E WHERE 25 *) FROM EMP
   WHERE MGR=E.EMPNO) AND JOB = ‘MANAGER'; 

     8、计算记录条数 和一般的观点相反, count(*) 比count(1)稍快 , 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO)

 原文地址

关注
打赏
1647422595
查看更多评论
立即登录/注册

微信扫码登录

0.0790s