查看: 29323|回复: 160

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

[复制链接]
招聘 : 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
跳转到指定楼层
1#
发表于 2007-12-6 11:21 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
好像是访问数据库的具体某张表的时候CPU使用就会达到100%!

这张表也reorg过,runstatus了!不知为什么?访问这张表的大数据量的计算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
161#
发表于 2007-12-15 12:33 | 只看该作者
而 LZ 可 以 考 虑 试 试 下 面 的 三 个 INDEXES。 注 意 , 我 只 是 觉 得 这 三 个 INDEX 对 这 个 SQL 有 用 , 不 考 虑 SP 中 其 他 的 SQL。

create unique index par_cust_grp_pk on PAR_CUST_CUST_GRP_ASSOC_200710(CUST_ID, CUST_GROUP_ID);

create unique index cust_churn_info_uk on cust_churn_info_200710(cust_id)
  include (pre_m_arpu_d,pre_m_arpu,now_arpu,on_net_time,leave_date);

create unique index cust_ccp_info_uk on cust_ccp_info_200710(cust_id)
  include (m,clv);

使用道具 举报

回复
论坛徽章:
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
160#
发表于 2007-12-15 12:30 | 只看该作者
原帖由 askgyliu 于 2007-12-15 11:14 发表
LZ 回 贴 #103
====>因为PAR_CUST_CUST_GRP_ASSOC_200709中cust_ID不是唯一记录,所以做了一个临时表V_HML_EAL_TEM来取唯一的cust_ID,只要能inner join V_HML_EAL_TEM就表示存在===引 用 结 束 ==

这 里 V_HML_EAL_TEM 是 不 是 V_PRE_EXP_GROUP_CUST1 的 笔 误 ?

而 PAR_CUST_CUST_GRP_ASSOC_200709 是 PAR_CUST_CUST_GRP_ASSOC_200710 的 笔 误 ?

可 以 把 V_PRE_EXP_GROUP_CUST1 的 INSERT 给 放 上 来 吗 ?


我 问 这 个 是 因 为 我 现 在 是 怀 疑 在 LZ 的 业 务 逻 辑 中 P2 & P3 都 只 是 subset of P1。 <补 充 : 还 有 , insert into v_pre_exp_group_cust1 select distinct cust_id from par_cust_cust_grp_assoc_200710?>

如 果 这 是 成 立 的 话 , 那 个 TEMP TABLE 就 是 多 余 的 了 。 整 个 逻 辑 用 下 面 的 SQL 就 应 当 可 以 完 成 了 :

      select  b.cust_group_id as group_id, aa.pre_m_arpu_d,
              sum(aa.PRE_M_ARPU) as a1_arpu,
              sum(cc.m) as a1_m,
              sum(cc.CLV) as a1_clv,
              sum(1) as EXIST_CUST_C,
              sum(aa.NOW_ARPU) as EXIST_SUM_NOW_ARPU,

              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 1 end) as ADD_CUST_C,
              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.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 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 PAR_CUST_CUST_GRP_ASSOC_200710 b inner join CUST_CHURN_INFO_200710 aa
             on aa.cust_id=b.cust_id
           inner join CUST_CCP_INFO_200710 cc
             on cc.cust_id=b.cust_id
--           left outer join V_PRE_EXP_GROUP_CUST1 a
--             on b.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')
      group by b.cust_group_id,aa.pre_m_arpu_d
;

[ 本帖最后由 askgyliu 于 2007-12-15 12:36 编辑 ]

使用道具 举报

回复
论坛徽章:
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
159#
发表于 2007-12-15 11:14 | 只看该作者
LZ 回 贴 #103
====>因为PAR_CUST_CUST_GRP_ASSOC_200709中cust_ID不是唯一记录,所以做了一个临时表V_HML_EAL_TEM来取唯一的cust_ID,只要能inner join V_HML_EAL_TEM就表示存在===引 用 结 束 ==

这 里 V_HML_EAL_TEM 是 不 是 V_PRE_EXP_GROUP_CUST1 的 笔 误 ?

而 PAR_CUST_CUST_GRP_ASSOC_200709 是 PAR_CUST_CUST_GRP_ASSOC_200710 的 笔 误 ?

可 以 把 V_PRE_EXP_GROUP_CUST1 的 INSERT 给 放 上 来 吗 ?

使用道具 举报

回复
论坛徽章:
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
158#
发表于 2007-12-15 11:04 | 只看该作者
可 以 把 下 面 的 输 出 给 放 上 来 吗 ?

select tabname, card, stats_time, npages, fpages, pmap_id
from syscat.tables
where tabname in ('V_PRE_EXP_GROUP_CUST1','CUST_CCP_INFO_200710','CUST_CHURN_INFO_200710','PAR_CUST_CUST_GRP_ASSOC_200710');

select nodenumber(cust_id), count(cust_id), count(distinct cust_id)
from CUST_CHURN_INFO_200710
group by nodenumber(cust_id)

select nodenumber(cust_id), count(cust_id), count(distinct cust_id)
from CUST_CCP_INFO_200710
group by nodenumber(cust_id)

select nodenumber(cust_id), count(cust_id), count(distinct cust_id)
from PAR_CUST_CUST_GRP_ASSOC_200710
group by nodenumber(cust_id)

select nodenumber(cust_id), count(cust_id), count(distinct cust_id)
from V_PRE_EXP_GROUP_CUST1
group by nodenumber(cust_id)

我 的 版 本 有 没 有 测 试 过 ? 可 以 把 EXPLAIN OUTPUT 给 放 上 来 吗 ?

使用道具 举报

回复
论坛徽章:
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
157#
发表于 2007-12-15 11:01 | 只看该作者
原帖由 myfriend2010 于 2007-12-15 09:28 发表
上次给CUST_CHURN_INFO_200710和CUST_CHURN_INFO_200709增加了主键!

后来运行我的这个存储过程,1整天24小时都没有出来结果,我查看执行计划,发现index用的很多!我感觉不合理,至少在我这边不合理,就把主键去掉了!速度就恢复正常了!我的总结是:在OLAP系统中,因为大部分都是全表扫描,所以主、外键都不合适!最好不用!

当然理解不一定很合理,但是对于我这边来说是正确的!



使 用 INDEX 不 一 定 就 会 快 。 一 个 不 合 适 的 INDEX 往 往 会 使 得 QUERY 更 慢 。
http://www.itpub.net/viewthread. ... hlight=%2BMACROZENG

我 回 贴 #142
====> 回 过 头 来 , 再 看 LZ 的 这 个 原 始 SQL。 我 倒 是 觉 得 问 题 不 太 可 能 出 在 TABLE SCAN 上:因 为 LZ 最原 始 的 SQL 就 是 三 个 SUB-QUERY 来 着 ,  那 九 个 TABLE SCAN 是 跑 不 掉 的 ,除 非 你 去 每 个 TABLE 都 创 建 一 个 FAT INDEX。 但 不 管 如 何 , 对 LZ 已 经 测 过 的 好 / 坏两 种 , 这 九 个 TABLE SCAN 或 是 FAT INDEX 都 是 一 样 的 。
====END OF #142===

下 面 这 句 话 也 很 难 有 说 服 力 因 为 你 的 这 个 情 况 很 难 说 是 一 个 典 型 的 OLAP 情 况 。 <在OLAP系统中,因为大部分都是全表扫描,所以主、外键都不合适!最好不用!>

在 你 的 这 个 特 殊 情 况 下 , 实 际 是 你 要 的 是 这 个 十 月 数 据 的 一 部 分 , 所 以 你 即 使 使 用 UNIQUE INDEX (CUST_ID), DB2 也 是 没 法 做 任 何 FILTERING。 但 在 一 个 典 型 的 OLAP/DSS 系 统 中 , FACT TABLE 里 面 会 有 好 几 年 的 数 据 , 而 一 般 的 REPORT 用 到 的 往 往 只 是 一 两 个 月 的 数 据 , 这 时 候 有 一 个 适 合 的 INDEX 就 非 常 重 要 了 。

[ 本帖最后由 askgyliu 于 2007-12-15 11:02 编辑 ]

使用道具 举报

回复
招聘 : 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
156#
 楼主| 发表于 2007-12-15 09:41 | 只看该作者
谢谢各位了哈!

[ 本帖最后由 myfriend2010 于 2007-12-15 09:42 编辑 ]

使用道具 举报

回复
招聘 : 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
155#
 楼主| 发表于 2007-12-15 09:37 | 只看该作者
原帖由 askgyliu 于 2007-12-14 22:49 发表
麻 烦 LZ 再 把 下 面 这 个 给 EXPLAIN 一 下 , 可 以 吗 ?

   select coalesce(a1.group_id,a2.group_id,a3.group_id) as group_id,
           coalesce(a1.pre_m_arpu_d,a2.pre_m_arpu_d,a3.pre_m_arpu_d),
           EXIST_CUST_C,ADD_CUST_C,LOSS_CUST_C, a1.arpu,a1.m,a1.clv, a2.arpu,
           a2.m,a2.clv, a3.arpu,a3.m,a3.clv, a1.EXIST_SUM_NOW_ARPU,
           a2.ADD_SUM_NOW_ARPU,a3.LOSS_SUM_NOW_ARPU
   from (
      select b.cust_group_id as group_id, aa.pre_m_arpu_d,sum(aa.PRE_M_ARPU)
              as arpu,sum(cc.m) as m,sum(cc.CLV) as clv, count(b.cust_id) as
              EXIST_CUST_C, sum(aa.NOW_ARPU) as EXIST_SUM_NOW_ARPU
      from session.V_PRE_EXP_GROUP_CUST1 a
              inner join CUST_CCP_INFO_200710 cc on
                cc.cust_id=a.cust_id
              inner join CUST_CHURN_INFO_200710 aa on
                aa.cust_id=cc.cust_id
              inner join PAR_CUST_CUST_GRP_ASSOC_200710 b on
                b.cust_id = aa.cust_id
      group by b.cust_group_id,aa.pre_m_arpu_d ) a1 full outer join
      (select b.cust_group_id as group_id,sum(cust.PRE_M_ARPU) as arpu,
              sum(cc.m) as m,sum(cc.CLV) as clv, count(b.cust_id) as
              ADD_CUST_C, cust.pre_m_arpu_d, sum(cust.NOW_ARPU) as
              ADD_SUM_NOW_ARPU
      from PAR_CUST_CUST_GRP_ASSOC_200710 b inner join
         (select base.cust_id,base.pre_m_arpu_d,base.NOW_ARPU,base.PRE_M_ARPU
         from CUST_CHURN_INFO_200710 base
         where on_net_time=4) cust on cust.cust_id=b.cust_id inner join
              CUST_CCP_INFO_200710 cc on cc.cust_id=b.cust_id
      group by b.cust_group_id,cust.pre_m_arpu_d ) a2 on
           a1.group_id=a2.group_id and a1.pre_m_arpu_d= a2.pre_m_arpu_d full
           outer join (
      select a.cust_group_id as group_id,sum(churn.PRE_M_ARPU) as arpu,
              sum(cc.m) as m,sum(cc.CLV) as clv, count(a.cust_id) as
              LOSS_CUST_C, churn.pre_m_arpu_d, sum(churn.NOW_ARPU) as
              LOSS_SUM_NOW_ARPU
      from PAR_CUST_CUST_GRP_ASSOC_200710 a inner join
         (select b.cust_id as cust_id,b.pre_m_arpu_d,b.PRE_M_ARPU,b.NOW_ARPU
         from CUST_CHURN_INFO_200710 b
         where b.LEAVE_DATE  

exfmt.txt

145.43 KB, 下载次数: 7

使用道具 举报

回复
招聘 : 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
154#
 楼主| 发表于 2007-12-15 09:30 | 只看该作者
这个不清楚啊!不知道为什么会这样!

原帖由 askgyliu 于 2007-12-14 21:23 发表
tes1.txt:

   1.45683e+006    4.36475e+006
      TBSCAN      TABLE: CCP      
      (  20)     PAR_CUST_CUST_GR
      663286
      375562
        |
   1.45683e+006
  TABLE: CCP      
CUST_CHURN_INFO_

里 面 显 示 cp.PAR_CUST_CUST_GRP_ASSOC_200709 才 4,364,750 rows? 那 DISTINCT CUST_ID怎 么 会 跑 到 五 百 多 万 上 去 ?

使用道具 举报

回复
招聘 : 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
153#
 楼主| 发表于 2007-12-15 09:29 | 只看该作者
select max(cnt), avg(cnt), min(cnt), sum(cnt)
from (select cust_id, count(cust_id) as cnt from ccp.PAR_CUST_CUST_GRP_ASSOC_200710 group by cust_id) as q
;
--
1             2           3             4

3        3        3        17427342

使用道具 举报

回复

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