设为首页 收藏本站
查看: 830|回复: 0

[经验分享] Oracle个人笔记(SQL性能)2A

[复制链接]

尚未签到

发表于 2016-7-27 07:34:16 | 显示全部楼层 |阅读模式
  1.
 ...group by (code,name); 性能要比 ...group by code,name ;强多
 
2.
在Oracle中,考虑惟一性时(NULL,NULL)与(NULL,NULL)并不相同,这是SQL标准要求的。
不过对于聚集来说(NULL,NULL)和(NULL,NULL)则认为是相同的。
两个(NULL,NULL)在比较时并不相同,但是对GROUP BY 子句来说却是一样的.
所以应当考虑到:每个惟一约束应该至少有一个确实惟一的NOT NULL列。
 
3.性能最高的删除重复记录的SQL
delete from AJ_SAWP r
where r.rowid in
 (select c.rowid from AJ_SAWP c,AJ_SAWP t where c.sjgxsj<t.sjgxsj and c.sjgxsj is not null
  and c.WPBH=t.WPBH);
 
4.执行更新SQL更新数据记录 并不会改变该记录的rowid
  5.用>=替代>,效率提高。
  6.IN和EXISTS 比较
SELECT COUNT(*) FROM CZRK WHERE GMSFHM IN (
       SELECT GMSFHM FROM CZRK HAVING COUNT(GMSFHM) > 1 GROUP BY GMSFHM
       );--137786行, 154.016 秒
  
SELECT COUNT(*) FROM CZRK T where EXISTS (
       SELECT GMSFHM FROM CZRK R WHERE T.GMSFHM=R.GMSFHM HAVING COUNT(GMSFHM) > 1 GROUP BY GMSFHM
       ); -- 137786行, 364.203--秒
    
      
7.用外联接提高表连接的查询速度
  在作表连接(常用于视图)时,常使用以下方法来查询数据:
  SELECT PAY_NO, PROJECT_NAME
  FROM A
  WHERE A.PAY_NO NOT IN (SELECT PAY_
  NO FROM B WHERE VALUE >=120000);
   ----但是若表A有10000条记录,表B有10000条记录,则要用掉30分钟才能查完,
  主要因为NOT IN要进行一条一条的比较,共需要10000*10000次比较后,才能得到结果。
  该用外联接后,可以缩短到1分左右的时间:
  SELECT PAY_NO,PROJECT_NAME
  FROM A,B
  WHERE A.PAY_NO=B.PAY_NO(+)
  AND B.PAY_NO IS NULL
  AND B.VALUE < 12000;
  8.用EXISTS替代IN、用NOT EXISTS替代NOT IN:
 (高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)
  (低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)
  9. 用EXISTS替换DISTINCT:
  (低效):
  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);
  10.避免在索引列上使用计算
  WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
  举例:
  低效:
  SELECT … FROM DEPT WHERE SAL * 12 > 25000;
  高效:
  SELECT … FROM DEPT WHERE SAL > 25000/12;
  11.用>=替代>
  12.巧用 case when...then...else 嵌套简化SQL
 select p.rq,SUM(case when p.shengfu='胜' then 1 else 0 end) WIN,
 SUM(case when p.shengfu='负' then 1 else 0 end) LOST
 from tmp p
 group by p.rq;----------------简洁
 
 select distinct p1.rq, t.s_times,r.f_times    
  from tmp p1,(select p2.rq,p2.shengfu,count(*) s_times from tmp p2 where p2.shengfu='胜' group by(rq,shengfu)) t,
  (select p3.rq,p3.shengfu,count(*) f_times from tmp p3 where p3.shengfu='负' group by (rq,shengfu)) r
  where p1.rq=t.rq and t.rq=r.rq;---------繁琐
  13.强制索引失效
     A.如果两个或以上索引具有相同的等级,则可以强制命令ORACLE优化器使用其中一个(通过它检索出记录数量少)。
     B.      SELECT ENAME FROM EMP
  WHERE ENPNO = 793
  AND DEPTNO + 0 = 10  /*DEPTNO上索引将失效*/
  AND EMPTYPE || '' = 'A';  /*EMPTYPE上索引将失效*/
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249889-1-1.html 上篇帖子: 如何修改Oracle 11gR2中的资源属性 下篇帖子: oracle中schema指的是什么?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表