楼主: anlinew

[精华] 几个SQL写法影响执行效率的案例

[复制链接]
论坛徽章:
0
31#
发表于 2010-12-6 13:19 | 只看该作者
对于目前的我只有学习的份

使用道具 举报

回复
论坛徽章:
3
2011新春纪念徽章
日期:2011-02-18 11:43:34茶鸡蛋
日期:2011-08-09 09:26:41ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29
32#
发表于 2011-2-11 13:38 | 只看该作者
收藏之

使用道具 举报

回复
论坛徽章:
8
2010广州亚运会纪念徽章:体操
日期:2011-05-02 23:25:242010广州亚运会纪念徽章:跆拳道
日期:2011-05-13 08:55:04蛋疼蛋
日期:2011-08-03 13:42:282012新春纪念徽章
日期:2012-01-04 11:53:54复活蛋
日期:2012-02-01 10:07:12咸鸭蛋
日期:2012-02-20 13:03:46马上有车
日期:2014-04-02 13:06:45问答徽章
日期:2014-04-18 18:01:23
33#
发表于 2011-3-17 22:03 | 只看该作者
好贴,学习一下,谢谢!

使用道具 举报

回复
论坛徽章:
8
数据库板块每日发贴之星
日期:2009-06-12 01:01:02数据库板块每日发贴之星
日期:2009-06-21 01:01:01ITPUB9周年纪念徽章
日期:2010-10-08 09:32:272010广州亚运会纪念徽章:游泳
日期:2010-11-12 16:42:092011新春纪念徽章
日期:2011-02-18 11:42:502010广州亚运会纪念徽章:三项全能
日期:2011-02-26 13:07:50咸鸭蛋
日期:2011-08-30 15:51:05ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22
34#
发表于 2011-8-30 21:00 | 只看该作者

回复 #14 rollingpig 的帖子

select * from some_table where or org_id in (
select 0 from dual
union all
select org_id from org_table start_with org_id = 0 connect by prior org_id = parent_org_id)
您为啥where后面还有个or呢,用org_id=0也可以噻。

使用道具 举报

回复
论坛徽章:
5
优秀写手
日期:2013-12-18 09:29:112014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上有钱
日期:2014-10-17 12:56:56处女座
日期:2015-08-30 22:09:39
35#
发表于 2014-4-4 22:04 | 只看该作者
本帖最后由 caroline0803 于 2014-4-4 22:04 编辑

楼主好。我这里遇到一个问题,请楼主帮忙看下把,感谢楼主。
如下,需要从多个表中进行统计,如下面的SQL语句所示,EMP1,EMP2,EMP3,EMP4代表,需要从四个业务表中,统计不同维度的值,
应该用哪种方式,能够提高效率呢;
第一种:
SELECT t1.deptno,
         (SELECT COUNT(1) FROM emp1 t WHERE t1.deptno = t.deptno) EMP1_COUNT,
         (SELECT SUM(SAL) FROM emp1 t WHERE t1.deptno = t.deptno) EMP1_SAL,
         (SELECT COUNT(1) FROM emp2 t WHERE t1.deptno = t.deptno) EMP2_COUNT,
         (SELECT SUM(SAL) FROM emp2 t WHERE t1.deptno = t.deptno) EMP2_SAL,
         (SELECT COUNT(1) FROM emp3 t WHERE t1.deptno = t.deptno) EMP3_COUNT,
         (SELECT SUM(SAL) FROM emp3 t WHERE t1.deptno = t.deptno) EMP3_SAL,
         (SELECT COUNT(1) FROM emp4 t WHERE t1.deptno = t.deptno) EMP4_COUNT,
         (SELECT SUM(SAL) FROM emp4 t WHERE t1.deptno = t.deptno) EMP4_SAL
    FROM dept t1
   GROUP BY t1.deptno;
第二种:
explain plan FOR
WITH A AS
(SELECT COUNT(DEPTNO) AS COUNTS_1, DEPTNO, SUM(SAL) AS SAL1 FROM emp1 GROUP BY DEPTNO),
T2 AS
(SELECT COUNT(DEPTNO) AS COUNTS_2, DEPTNO, SUM(SAL) AS SAL2 FROM emp2 GROUP BY DEPTNO),
t3 AS
(SELECT COUNT(DEPTNO) AS COUNTS_3, DEPTNO, SUM(SAL) AS SAL4 FROM emp3 GROUP BY DEPTNO),
t4 AS
(SELECT COUNT(DEPTNO) AS COUNTS_4, DEPTNO, SUM(SAL) AS SAL4 FROM emp4 GROUP BY DEPTNO)
SELECT *
  FROM DEPT T1
  LEFT JOIN A
    ON T1.DEPTNO = A.DEPTNO
  LEFT JOIN T2
    ON T1.DEPTNO = T2.DEPTNO
  LEFT JOIN T3
    ON T1.DEPTNO = T3.DEPTNO
  LEFT JOIN T4
    ON T1.DEPTNO = T4.DEPTNO;
第三种:
SELECT *
  FROM DEPT T1
  LEFT JOIN (SELECT COUNT(DEPTNO) AS COUNTS_1, DEPTNO, SUM(SAL) AS SAL1 FROM emp1 GROUP BY DEPTNO) A
    ON T1.DEPTNO = A.DEPTNO
  LEFT JOIN (SELECT COUNT(DEPTNO) AS COUNTS_2, DEPTNO, SUM(SAL) AS SAL2 FROM emp2 GROUP BY DEPTNO) T2
    ON T1.DEPTNO = T2.DEPTNO
  LEFT JOIN (SELECT COUNT(DEPTNO) AS COUNTS_3, DEPTNO, SUM(SAL) AS SAL4 FROM emp3 GROUP BY DEPTNO) T3
    ON T1.DEPTNO = T3.DEPTNO
  LEFT JOIN (SELECT COUNT(DEPTNO) AS COUNTS_4, DEPTNO, SUM(SAL) AS SAL4 FROM emp4 GROUP BY DEPTNO) T4
    ON T1.DEPTNO = T4.DEPTNO
那种方式可以更好呢,我觉得第一种方式较好,
原帖见:http://www.itpub.net/thread-1854190-1-1.html

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
36#
 楼主| 发表于 2014-4-9 11:07 | 只看该作者
第一种不好,2、3差不多

使用道具 举报

回复
论坛徽章:
4
2011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
37#
发表于 2014-4-9 11:15 | 只看该作者
很不错!

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
38#
 楼主| 发表于 2014-4-9 11:22 | 只看该作者
ignu 发表于 2010-11-19 20:03
10046的trace  虽然看上去全部等待的是  SQL*Net message from client ,其实这时间  SQL*Net messag ...

很好,我只说了问题现象,你补充了原因“ EVENT的信息是上一步的等待”
通过这个我们也能大概可以猜测一下EVENT体系的一些运行机制,在我们自己的其他系统进行借鉴

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
10
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-27 06:00:12ITPUB社区千里马徽章
日期:2013-06-09 10:15:342013年新春福章
日期:2013-02-25 14:51:24奥运纪念徽章
日期:2012-11-28 09:33:31奥运纪念徽章
日期:2012-11-20 10:27:31ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42马上有对象
日期:2014-02-18 16:44:08
39#
发表于 2014-5-15 16:50 | 只看该作者
本帖最后由 dotaddjj 于 2014-5-15 16:50 编辑

顶了,最近遇见的几个案例是在10.2.0.5下 子查询无法展开,而元凶就是几个or引起的,改写了sql,同样开发人员写sql
SELECT *
  FROM table02 b
WHERE object_id IN (SELECT object_id
                       FROM table02 a
                      WHERE b.object_id > 5000);

也走了一个糟糕的filter,确实是好贴,dba和开发人员都得注意!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表