楼主: myfriend2010

[FAQ] sql 使CPU使用100%,棘手!

[复制链接]
论坛徽章:
21
在线时间
日期:2007-07-25 04:01:022012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
121#
发表于 2007-12-14 13:12 | 只看该作者
原帖由 myfriend2010 于 2007-12-14 13:06 发表


我觉得你的做法,不应该是最佳的吧 !把inner join 刻意换成left outer join 不应该吧!


那你觉得把三个CONDITION写成三个SUB-QUERY,再来FULL OUTER JOIN比较好?

在LZ的业务要求中,你觉得哪种会可能比较好呢?

我再次强调一下,这种LEFT OUTER JOIN+WHERE OUTER_TABLE。COLUMN IS NOT NULL并不是会经常用到的。但在特定情况下,是适当的。

使用道具 举报

回复
论坛徽章:
21
在线时间
日期:2007-07-25 04:01:022012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
122#
发表于 2007-12-14 13:24 | 只看该作者
看看这个。

即使是同一个数据库,同一个SQL,同一个TABLE,同一个INDEX,对DB2(or RDBMS optimizer in general)都可能是意味着不同的含义,而可能会有完全不同的ACCESS PLAN!

http://www.itpub.net/viewthread. ... p%3Bfilter%3Ddigest

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
123#
 楼主| 发表于 2007-12-14 13:51 | 只看该作者
这个我承认!

原帖由 askgyliu 于 2007-12-14 13:24 发表
看看这个。

即使是同一个数据库,同一个SQL,同一个TABLE,同一个INDEX,对DB2(or RDBMS optimizer in general)都可能是意味着不同的含义,而可能会有完全不同的ACCESS PLAN!

http://www.itpub.net/viewthread. ... p%3Bfilter%3Ddigest

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
124#
 楼主| 发表于 2007-12-14 13:56 | 只看该作者
原帖由 askgyliu 于 2007-12-14 13:12 发表


那你觉得把三个CONDITION写成三个SUB-QUERY,再来FULL OUTER JOIN比较好?

在LZ的业务要求中,你觉得哪种会可能比较好呢?

我再次强调一下,这种LEFT OUTER JOIN+WHERE OUTER_TABLE。COLUMN IS NOT NULL并不是会经常用到的。但在特定情况下,是适当的。



也是哈!且不说哪个性能好了!其实我那段sql写成哪个样子也够失败的!

拆成小段代码,或者你那样子合并起来肯定是比较理想的!

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
125#
 楼主| 发表于 2007-12-14 13:56 | 只看该作者
且说,CPU使用的问题!为什么回满CPU呢?

使用道具 举报

回复
论坛徽章:
21
在线时间
日期:2007-07-25 04:01:022012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
126#
发表于 2007-12-14 14:01 | 只看该作者
相信下面两个SQL都可以满足LZ的业务逻辑要求

<第三种写法>
/home/db2inst/sql_performance/test2 > cat t3.sql

      select  b.cust_group_id as group_id, aa.pre_m_arpu_d,
--              sum(case when a.cust_id is not null then aa.PRE_M_ARPU end) as a1_arpu,
--              sum(case when a.cust_id is not null then cc.m end) as a1_m,
--              sum(case when a.cust_id is not null then cc.CLV end) as a1_clv,
--              sum(case when a.cust_id is not null then 1 end) as EXIST_CUST_C,

--              sum(case when aa.on_net_time=4 then aa.PRE_M_ARPU end) as a2_arpu,
--              sum(case when aa.on_net_time=4 then cc.m end) as a2_m,
--              sum(case when aa.on_net_time=4 then cc.CLV end) as a2_clv,
--              sum(case when aa.on_net_time=4 then b.cust_id end) as ADD_CUST_C,

--              sum(case when aa.leave_date<='3000-11-30 00:00:00' then aa.PRE_M_ARPU end) as a3_arpu,
--              sum(case when aa.leave_date<='3000-11-30 00:00:00' then cc.m end) as a3_m,
--              sum(case when aa.leave_date<='3000-11-30 00:00:00' then cc.CLV end) as a3_clv,
--              sum(case when aa.leave_date<='3000-11-30 00:00:00' then 1 end) as LOSS_CUST_C,
--              sum(case when a.cust_id is not null then aa.NOW_ARPU end) as EXIST_SUM_NOW_ARPU,
              sum(case when aa.on_net_time=4 then aa.NOW_ARPU end) as ADD_SUM_NOW_ARPU ,
              sum(case when aa.leave_date<='3000-11-30 00:00:00' then aa.NOW_ARPU end) as LOSS_SUM_NOW_ARPU
--              COUNT(b.CUST_ID) as OCCURANCE,
--              COUNT(DISTINCT b.CUST_ID) as OCCURANCE2

      from
           (select aa.cust_id, aa.pre_m_arpu_d, aa.on_net_time, aa.leave_date, pre_m_arpu, now_arpu
            from CUST_CHURN_INFO_200710 aa left outer join V_PRE_EXP_GROUP_CUST1 a
              on aa.cust_id = a.cust_id
            where (a.cust_id is not null or
                aa.on_net_time=4 or
                aa.LEAVE_DATE <= '3000-11-30 00:00:00')) aa
           inner join CUST_CCP_INFO_200710 cc
             on aa.cust_id=cc.cust_id
           inner join PAR_CUST_CUST_GRP_ASSOC_200710 b
             on aa.cust_id=b.cust_id
      group by b.cust_group_id,aa.pre_m_arpu_d
;

/home/db2inst/sql_performance/test2 > db2 -tf t3.sql

GROUP_ID               PRE_M_ARPU_D         ADD_SUM_NOW_ARPU                  LOSS_SUM_NOW_ARPU
---------------------- -------------------- --------------------------------- ---------------------------------
                    1. A                                                34.70                             34.70
                    2. A                                                20.60                             20.60

  2 record(s) selected.

<第四种写法>
/home/db2inst/gaoyuan/sql_performance/test2 > cat t4.sql

      select  b.cust_group_id as group_id, aa.pre_m_arpu_d,
--              sum(case when a.cust_id is not null then aa.PRE_M_ARPU end) as a1_arpu,
--              sum(case when a.cust_id is not null then cc.m end) as a1_m,
--              sum(case when a.cust_id is not null then cc.CLV end) as a1_clv,
--              sum(case when a.cust_id is not null then 1 end) as EXIST_CUST_C,

--              sum(case when aa.on_net_time=4 then aa.PRE_M_ARPU end) as a2_arpu,
--              sum(case when aa.on_net_time=4 then cc.m end) as a2_m,
--              sum(case when aa.on_net_time=4 then cc.CLV end) as a2_clv,
--              sum(case when aa.on_net_time=4 then b.cust_id end) as ADD_CUST_C,

--              sum(case when aa.leave_date<='3000-11-30 00:00:00' then aa.PRE_M_ARPU end) as a3_arpu,
--              sum(case when aa.leave_date<='3000-11-30 00:00:00' then cc.m end) as a3_m,
--              sum(case when aa.leave_date<='3000-11-30 00:00:00' then cc.CLV end) as a3_clv,
--              sum(case when aa.leave_date<='3000-11-30 00:00:00' then 1 end) as LOSS_CUST_C,
--              sum(case when a.cust_id is not null then aa.NOW_ARPU end) as EXIST_SUM_NOW_ARPU,
              sum(case when aa.on_net_time=4 then aa.NOW_ARPU end) as ADD_SUM_NOW_ARPU ,
              sum(case when aa.leave_date<='3000-11-30 00:00:00' then aa.NOW_ARPU end) as LOSS_SUM_NOW_ARPU
--              COUNT(b.CUST_ID) as OCCURANCE,
--              COUNT(DISTINCT b.CUST_ID) as OCCURANCE2

      from
          ((select aa.cust_id, aa.pre_m_arpu_d, aa.on_net_time, aa.leave_date, pre_m_arpu, now_arpu
            from V_PRE_EXP_GROUP_CUST1 a inner join CUST_CHURN_INFO_200710 aa
              on aa.cust_id = a.cust_id) union
           (select aa.cust_id, aa.pre_m_arpu_d, aa.on_net_time, aa.leave_date, pre_m_arpu, now_arpu
            from CUST_CHURN_INFO_200710 aa
            where aa.on_net_time=4 or aa.LEAVE_DATE <= '3000-11-30 00:00:00') ) as aa
           inner join CUST_CCP_INFO_200710 cc
             on aa.cust_id=cc.cust_id
           inner join PAR_CUST_CUST_GRP_ASSOC_200710 b
             on aa.cust_id=b.cust_id
      group by b.cust_group_id,aa.pre_m_arpu_d
;

/home/db2inst/sql_performance/test2 > db2 -tf t4.sql

GROUP_ID               PRE_M_ARPU_D         ADD_SUM_NOW_ARPU                  LOSS_SUM_NOW_ARPU
---------------------- -------------------- --------------------------------- ---------------------------------
                    1. A                                                34.70                             34.70
                    2. A                                                20.60                             20.60

  2 record(s) selected.

第四种写法中我假设数据会有OVERLAPPING。若是没有OVERLAPPING的话,UNION可以换成UNION ALL。

而这么多种写法中,在不同特定条件下,每一种都有比其他写法执行得快的可能。DATA PATTERN在不同写法中的PERFORMANCE有着决定性的作用。

实践是检验真理的唯一标准,测试是回答PERFORMANCE问题的最佳途径。

使用道具 举报

回复
论坛徽章:
21
在线时间
日期:2007-07-25 04:01:022012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
127#
发表于 2007-12-14 14:03 | 只看该作者
我相信最起码还有多两种写法。

使用道具 举报

回复
论坛徽章:
21
在线时间
日期:2007-07-25 04:01:022012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
128#
发表于 2007-12-14 14:05 | 只看该作者
原帖由 myfriend2010 于 2007-12-14 13:56 发表
且说,CPU使用的问题!为什么回满CPU呢?


AIX中的话可以看是哪个PROCESS用掉CPU,再连到APPLICATION SNAPSHOT中对照。再来尝试解释。

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
129#
 楼主| 发表于 2007-12-14 14:08 | 只看该作者
恩,我相信也有很多种写法!

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
130#
 楼主| 发表于 2007-12-14 14:12 | 只看该作者
原帖由 askgyliu 于 2007-12-14 14:05 发表


AIX中的话可以看是哪个PROCESS用掉CPU,再连到APPLICATION SNAPSHOT中对照。再来尝试解释。



我可以肯定问题就在临时表那边,如果不使用临时表就正常!而且就是这段代码造成的!这个askgyliu你就相信我吧!

使用道具 举报

回复

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

本版积分规则 发表回复

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