楼主: myfriend2010

[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
141#
 楼主| 发表于 2007-12-14 20:25 | 只看该作者
select count(1) from session.V_PRE_EXP_GROUP_CUST1;

----
1

5821522

使用道具 举报

回复
论坛徽章:
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
142#
发表于 2007-12-14 20:51 | 只看该作者
现 在 我 们 已 经 知 道 LZ 的 业 务 逻 辑 了 , 也 知 道 可 以 有 多 个 选 择 。 LZ 可 以 测 试 不 同 写 法 的 PERFORMANCE 以 决 定 要 用 哪 个 。 我 觉 得 这 个 是 APPLICATION PERFORMANCE TUNING APPROACH。

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

而 是 在 最 右 下 角 的 三 个 HASH JOIN 上: PAR_CUST_CUST_GR 的 CUST_ID 是 可 能 重 复 出 现 多 次 的 , 而 这 会 导 致 右 下 角 第 一 / 二 个 HASH JOIN 之 后 出 现 大 量 的 INTERMEDIATE RESULT。

几 天 前 (#53) 就 向 LZ 要 求 这 几 个 TABLE 的 大 概 情 况 :

select max(cnt), min(cnt), avg(cnt), sum(cnt)
from (select cust_id, count(cust_id) as cnt from <table_name> group by cust_id)

但 LZ 一 直 都 没 有 提 供 。

使用道具 举报

回复
论坛徽章:
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
143#
发表于 2007-12-14 20:54 | 只看该作者
还 有 一 点 , 既 然 CUST_ID / CUST_GROUP_ID 在 那 些 TABLES 上 是 唯 一 的 , 那 为 什 么 不 在 DDL 中 定 义 清 楚 呢 ? 我 相 信 这 一 点 对 DB2 OPTIMIZER 的 影 响 是 会 很 大 的 。

使用道具 举报

回复
论坛徽章:
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
144#
发表于 2007-12-14 20:55 | 只看该作者
可 以 看 一 下 在 SQL 执 行 是 TEMP SPACE 是 不 是 很 大 , 长 得 很 快 ?

使用道具 举报

回复
论坛徽章:
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
145#
发表于 2007-12-14 21:13 | 只看该作者
可 以 给 下 面 的 OUTPUT 吗 ?

Select COUNT (distinct cust_id )  from ccp.PAR_CUST_CUST_GRP_ASSOC_200709

[ 本帖最后由 askgyliu 于 2007-12-14 21:18 编辑 ]

使用道具 举报

回复
论坛徽章:
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
146#
发表于 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怎 么 会 跑 到 五 百 多 万 上 去 ?

使用道具 举报

回复
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
147#
发表于 2007-12-14 22:07 | 只看该作者
原帖由 askgyliu 于 2007-12-14 21:54 发表
还 有 一 点 , 既 然 CUST_ID / CUST_GROUP_ID 在 那 些 TABLES 上 是 唯 一 的 , 那 为 什 么 不 在 DDL 中 定 义 清 楚 呢 ? 我 相 信 这 一 点 对 DB2 OPTIMIZER 的 影 响 是 会 很 大 的 。

这个说到点子上了嘛,在plan里面你有没有发现所有的东西全是tablescan?恨不得在filter之后只有2-3行的也对全表的几百万数据完全扫描一次
,然后还要对所有的这些数据作hash join~~~在hash join里面要对每一个记录作hash,我想cpu高可能也就有它的道理了。。。

在不使用temp得情况下,对9月份的表走的是msjoin,并且表之间join得顺序和temp table下的不同~~~因为在temp table中,db2认为临时表只有151行,但是从LZ得select count(*)看起来好像远远不止151行,所以结果集可能被无限倍的放大,然后还要对所有的纪录都作hash.....

使用道具 举报

回复
论坛徽章:
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
148#
发表于 2007-12-14 22:15 | 只看该作者
刚 刚 才 回 头 去 看 LZ 09 (EXFMT)的 ACCESS PLAN, 发 现 右 下 角 的 几 个 HASH JOIN 中 , PAR_CUST_CUST_GR 是 最 后 才 JOINED 的 ! 这 个 跟 我 的 怀 疑 (10 有 问 题 是 因 为 PAR_CUST_CUST_GR 太 早 被 JOINED 了 ) 很 是 巧 合 。

使用道具 举报

回复
论坛徽章:
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
149#
发表于 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 <= '3000-11-30 00:00:00') churn on
              churn.cust_id=a.cust_id inner join CUST_CCP_INFO_200710 cc
              on cc.cust_id=a.cust_id
      group by a.cust_group_id,churn.pre_m_arpu_d ) a3 on
           a1.group_id=a3.group_id and a1.pre_m_arpu_d= a3.pre_m_arpu_d

使用道具 举报

回复
招聘 : 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
150#
 楼主| 发表于 2007-12-15 09:16 | 只看该作者
Select COUNT (distinct cust_id )  from ccp.PAR_CUST_CUST_GRP_ASSOC_200709;
---
A

5821522

使用道具 举报

回复

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

本版积分规则 发表回复

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