查看: 5812|回复: 22

[性能调整] 只取291条记录,结果执行了五分多钟,求优化

[复制链接]
论坛徽章:
10
九尾狐狸
日期:2006-04-12 17:38:17会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-04-17 20:13:232011新春纪念徽章
日期:2011-02-18 11:43:35
发表于 2011-7-8 16:55 | 显示全部楼层 |阅读模式
一条语句,只是取到291条记录,而且都走了索引,但是还需要322秒,这太慢了,请各位大虾指点一下

其中三个表,每一个表的数据量不超过一千万.

SELECT /*+ ordered index(b,I_hd_yjszsx_NSRNBM_ZSPM)*/ a.nsrnbm,c.nsrbm,c.nsr_mc,sbfs_dm,jkfs_dm,sz_dm zsxm_dm,pm_dm zspm_dm,jsje,sl,sbqx_dm,jkqx_dm,
nsqx_dm,zsfs zsfs_dm,hd_qsrq,hd_zzrq,sj_zzrq,dkdjbz,jyxm_dm,c.gljg_dm,c.dj_zt,c.zclx_dm,c.zgy,c.xzjd_dm,c.lxdh_dh
FROM db_ods.t_hd_yjszsx b,db_ods.t_hd_nshd a,db_ods.T_DJ_NSRXX c
WHERE a.nsrnbm=b.nsrnbm(+) AND a.nsrnbm=c.nsrnbm and c.GLJG_DM = '244060607' AND c.DJ_ZT = '20' AND b.sz_DM = '02' AND  b.pm_DM = '0705'

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       21     25.47     322.64      68812      98016          0         291
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       23     25.47     322.65      68812      98016          0         291

Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: SYS

Rows     Row Source Operation
-------  ---------------------------------------------------
    291  HASH JOIN
  29622   TABLE ACCESS BY INDEX ROWID T_DJ_NSRXX
  29622    INDEX RANGE SCAN I_DJ_NSRXX_GLJG_DJZT (object id 317778)
   9115   NESTED LOOPS
   9115    TABLE ACCESS BY INDEX ROWID T_HD_YJSZSX
   9115     INDEX FULL SCAN I_HD_YJSZSX_NSRNBM_ZSPM (object id 317779)
   9115    TABLE ACCESS BY INDEX ROWID T_HD_NSHD
   9115     INDEX UNIQUE SCAN PK_T_HD_NSHD (object id 315873)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                      21        0.00          0.00
  db file sequential read                     68812        0.38        295.74
  buffer busy waits                               1        0.01          0.01
  SQL*Net message from client                    21       13.37         13.47
********************************************************************************

alter session set events '10046 trace name context off'
认证徽章
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
发表于 2011-7-8 17:00 | 显示全部楼层
如果可以索引rebulid一下会如何?

使用道具 举报

回复
论坛徽章:
17
2008新春纪念徽章
日期:2008-02-13 12:43:032014年新春福章
日期:2014-02-18 16:42:02优秀写手
日期:2013-12-18 09:29:13奥迪
日期:2013-09-12 15:57:04凯迪拉克
日期:2013-08-26 22:55:57红旗
日期:2013-08-15 13:57:06茶鸡蛋
日期:2013-05-29 11:38:412013年新春福章
日期:2013-02-25 14:51:24ITPUB季度 技术新星
日期:2012-02-16 14:53:162012新春纪念徽章
日期:2012-01-04 11:51:22
发表于 2011-7-8 17:06 | 显示全部楼层
a.nsrnbm=b.nsrnbm(+)  b.pm_DM = '0705'

ordered index(b,I_hd_yjszsx_NSRNBM_ZSPM)       ->   INDEX FULL SCAN I_HD_YJSZSX_NSRNBM_ZSPM (object id 317779)

try explain without hint

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2011-7-8 17:07 | 显示全部楼层
原帖由 yuantong 于 2011-7-8 16:55 发表
一条语句,只是取到291条记录,而且都走了索引,但是还需要322秒,这太慢了,请各位大虾指点一下

其中三个表,每一个表的数据量不超过一千万.

SELECT /*+ ordered index(b,I_hd_yjszsx_NSRNBM_ZSPM)*/ a.nsrnbm,c.nsrbm,c.nsr_mc,sbfs_dm,jkfs_dm,sz_dm zsxm_dm,pm_dm zspm_dm,jsje,sl,sbqx_dm,jkqx_dm,
nsqx_dm,zsfs zsfs_dm,hd_qsrq,hd_zzrq,sj_zzrq,dkdjbz,jyxm_dm,c.gljg_dm,c.dj_zt,c.zclx_dm,c.zgy,c.xzjd_dm,c.lxdh_dh
FROM db_ods.t_hd_yjszsx b,db_ods.t_hd_nshd a,db_ods.T_DJ_NSRXX c
WHERE a.nsrnbm=b.nsrnbm(+) AND a.nsrnbm=c.nsrnbm and c.GLJG_DM = '244060607' AND c.DJ_ZT = '20' AND b.sz_DM = '02' AND  b.pm_DM = '0705'

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       21     25.47     322.64      68812      98016          0         291
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       23     25.47     322.65      68812      98016          0         291

Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: SYS

Rows     Row Source Operation
-------  ---------------------------------------------------
    291  HASH JOIN
  29622   TABLE ACCESS BY INDEX ROWID T_DJ_NSRXX
  29622    INDEX RANGE SCAN I_DJ_NSRXX_GLJG_DJZT (object id 317778)
   9115   NESTED LOOPS
   9115    TABLE ACCESS BY INDEX ROWID T_HD_YJSZSX
   9115     INDEX FULL SCAN I_HD_YJSZSX_NSRNBM_ZSPM (object id 317779)
   9115    TABLE ACCESS BY INDEX ROWID T_HD_NSHD
   9115     INDEX UNIQUE SCAN PK_T_HD_NSHD (object id 315873)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                      21        0.00          0.00
  db file sequential read                     68812        0.38        295.74
  buffer busy waits                               1        0.01          0.01
  SQL*Net message from client                    21       13.37         13.47
********************************************************************************

alter session set events '10046 trace name context off'


10046文件,怎么没有各步骤的耗时情况?

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2011-7-8 17:09 | 显示全部楼层
/*+ ordered index(b,I_hd_yjszsx_NSRNBM_ZSPM)*/

收集下统计信息,让CBO自己决定不好,你这个指定索引还有指定驱动表可能有问题

ps:你的+是多余的

使用道具 举报

回复
论坛徽章:
10
九尾狐狸
日期:2006-04-12 17:38:17会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-04-17 20:13:232011新春纪念徽章
日期:2011-02-18 11:43:35
 楼主| 发表于 2011-7-8 17:12 | 显示全部楼层
首先,表都是分析过的

如果不加hint,更难,超过10分钟

另外,9i的10046 是没有各个步骤耗时的

使用道具 举报

回复
论坛徽章:
20
2010广州亚运会纪念徽章:体育舞蹈
日期:2010-11-11 18:01:26蛋疼蛋
日期:2012-02-20 22:31:53ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42雪铁龙
日期:2014-01-21 15:42:172014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:022015年新春福章
日期:2015-03-04 14:51:122012新春纪念徽章
日期:2012-01-04 11:50:44
发表于 2011-7-8 17:22 | 显示全部楼层
考虑一下从业务逻辑的角度,看有没有其它隐含的条件可以加

使用道具 举报

回复
论坛徽章:
15
2011新春纪念徽章
日期:2011-02-18 11:42:47马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02夏利
日期:2014-01-05 23:30:122013年新春福章
日期:2013-02-25 14:51:24咸鸭蛋
日期:2013-01-06 18:38:44复活蛋
日期:2012-12-27 22:39:382012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15蛋疼蛋
日期:2011-08-03 23:04:21
发表于 2011-7-9 11:43 | 显示全部楼层
第一次执行 disk reads 很大 , 考虑一下SGA 和 IO 如何?

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2007-08-09 15:37:26会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-15 21:12:09ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2013-06-24 14:20:02
发表于 2011-7-9 12:17 | 显示全部楼层
SELECT /*+ ordered USE_NL(a, c) index(b,I_hd_yjszsx_NSRNBM_ZSPM)*/

INDEX FULL SCAN I_HD_YJSZSX_NSRNBM_ZSPM
走index full 这个索引建得有问题 得重建 应为range scan

[ 本帖最后由 catchwo 于 2011-7-9 12:47 编辑 ]

使用道具 举报

回复
认证徽章
论坛徽章:
9
ITPUB社区OCM联盟徽章
日期:2013-03-27 11:17:11奥运纪念徽章
日期:2013-06-18 09:13:52ITPUB社区千里马徽章
日期:2013-08-22 09:58:03大众
日期:2013-08-30 14:51:33路虎
日期:2013-12-01 18:25:42
发表于 2011-7-9 13:06 | 显示全部楼层
物理读好高啊。
能否给除如下信息:
加入/*+  gather_plan_statistics */提示运行   
然后输出这个结果select * from table(dbms_xplan.display_cursor(null,null,'iostats last'));
没有具体的执行计划和消耗的时间,不好确定哪一步出了问题。COST并不准确,我们需要基于时间来看。
ORACLE现在不是都进入了基于等待事件的时代?

使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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