免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3541 | 回复: 9
打印 上一主题 下一主题

有一条语句,占用很高的cpu请问是什么原因 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-19 19:21 |只看该作者 |倒序浏览
数据库是9i的 ,应用做个报表,客户反映很慢
我跟踪了一个sql语句,发现很占cpu资源,


UPDATE tmptotal d
           set d.produceday=(select sum(nvl(b.drQuantity,0))
                             from day_records b,Day_Record a,machine c
                            where a.recordid=b.recordid
                              and a.drdate>=c.begindate
                              and a.drstate = '2'
                              and b.machinecode = c.machinecode
                              and a.depcode = d.itemcode
                              and to_char(a.drDate,'YYYYMMDD') = to_char(:b3,'YYYYMMDD')
                              and c.MachineType<>'小水电机组'
                              and b.iftest='0'),
              d.ratepower=(select nvl(sum(b.ratingpower*decode(a.depcode,'109',0.4,1)/10000),d.ratepower)
                             from day_records b,Day_Record a,machine c
                            where a.recordid=b.recordid
                              and a.drdate>=c.begindate
                              and a.drstate = '2'
                              and b.machinecode = c.machinecode
                              and a.depcode = d.itemcode
                              and to_char(a.drDate,'YYYYMMDD') = to_char(:b3,'YYYYMMDD')
                              and c.MachineType<>'小水电机组'
                              --and b.iftest='0'
                              )               
         where d.itemcode not in(:b2 || '_' || '1',:b2 || '_' || '2',:b2 || '_' || '3',:b2 || '_' || '4',:b2 || '_' || '5')
           and d.iftest=0
           and d.Random = :b1

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.00          0          0          0           0
Execute    1     25.70      25.73         0     176398    78          38
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2     25.71      25.74          0     176398   78          38

Misses in library cache during parse: 1
Optimizer goal: CHOOSE

之后我把优化器改成cbo
后来看了下这个语句的执行计划 也不高 cost在200左右
我看了下event 也都是一些关于control file 并行写之类的

请问这个是什么情况?有什么优化的思路么??

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
2 [报告]
发表于 2011-09-20 08:49 |只看该作者
如果要做优化的话,请提供该语句中所有涉及到表的结构,比如字段类型、索引等信息

另外最好给出该语句的执行计划,不然很难下手,希望对你有所启示!

论坛徽章:
0
3 [报告]
发表于 2011-09-20 10:59 |只看该作者
回复 2# duolanshizhe


    Execution Plan
----------------------------------------------------------
   0      UPDATE STATEMENT Optimizer=ALL_ROWS (Cost=11 Card=1 Bytes=7
   1    0   UPDATE OF 'TMPTOTAL'
   2    1     TABLE ACCESS (FULL) OF 'TMPTOTAL' (Cost=11 Card=1 Bytes=7
   3    1     SORT (AGGREGATE)
   4    3       HASH JOIN (Cost=218 Card=1 Bytes=62)
   5    4         HASH JOIN (Cost=215 Card=10 Bytes=380)
   6    5           TABLE ACCESS (FULL) OF 'DAY_RECORD' (Cost=106 Card=5 Bytes=95)
   7    5           TABLE ACCESS (FULL) OF 'DAY_RECORDS' (Cost=108 Card=107142 Bytes=203569
   8    4         TABLE ACCESS (FULL) OF 'MACHINE' (Cost=2 Card=138 Bytes=3312)
   9    1     SORT (AGGREGATE)
  10    9       HASH JOIN (Cost=218 Card=1 Bytes=59)
  11   10         HASH JOIN (Cost=215 Card=19 Bytes=665)
  12   11           TABLE ACCESS (FULL) OF 'DAY_RECORD' (Cost=106 Card=5 Bytes=95)
  13   11           TABLE ACCESS (FULL) OF 'DAY_RECORDS' (Cost=108 Card=214284 Bytes=3428544)
  14   10         TABLE ACCESS (FULL) OF 'MACHINE' (Cost=2 Card=138 Bytes=3312)

这个是执行计划 在select的时候稍微高点,可是在update时又变的很低...



以下是根据上面的表所对应的索引和列
INDEX_NAME                     TABLE_NAME                     COLUMN_NAME
------------------------------ ------------------------------ ------------------------------
IND_DR_DATE                    DAY_RECORD                     SYS_NC00042$
PK_DAYRECORDS                  DAY_RECORDS                    MRECORDID
U_DAYRECORDS                   DAY_RECORDS                    MRECORDID
U_DAYRECORDS                   DAY_RECORDS                    MACHINECODE
PK_MACHINECODE                 MACHINE                        MACHINECODE
UK_MACHINE                     MACHINE                        FACGROUP
UK_MACHINE                     MACHINE                        MACHINESORT


看来要重写sql了吧?

论坛徽章:
0
4 [报告]
发表于 2011-09-20 16:17 |只看该作者
本帖最后由 wodi1015 于 2011-09-20 16:23 编辑

能说说这些表有多少行记录,以及各个表之间的关系,另外从你的sql 的plan看 一个index也没用上,你有建立index的权限么?

论坛徽章:
0
5 [报告]
发表于 2011-09-20 21:10 |只看该作者
ind_dr_date看上去象一个基于函数的索引,所以SQL中大小写是否正确?
另外这个字段不建议这样索引,最好用dr_date=to_date()

论坛徽章:
0
6 [报告]
发表于 2011-09-20 21:15 |只看该作者
drstate分辨率高吗?
如果高的话,建议建索引

论坛徽章:
0
7 [报告]
发表于 2011-09-24 14:58 |只看该作者
貌似这个哥们问了问题 就再也不来了

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
8 [报告]
发表于 2011-09-24 23:03 |只看该作者
看来这个SQL有狂热的计算啊。

论坛徽章:
0
9 [报告]
发表于 2011-09-26 11:38 |只看该作者
都是全表扫描.COST主要都在这几个扫描上了.

论坛徽章:
7
天蝎座
日期:2013-08-16 23:19:32丑牛
日期:2014-01-08 09:20:14寅虎
日期:2014-01-11 11:03:44午马
日期:2014-04-28 11:02:40天秤座
日期:2014-05-16 23:24:24摩羯座
日期:2014-07-20 10:46:04卯兔
日期:2014-08-08 15:21:41
10 [报告]
发表于 2011-10-02 20:36 |只看该作者
sql执行计划有问题,要么表统计信息错误,要么相关的表没有索引。

对于筛选条件的列段需要添加索引,过滤掉大量的数据,将有效的减少扫描数据块的次数。降低对cpu资源的
消耗。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP