查看: 15224|回复: 41

话题讨论:oracle的执行计划,你会看么?

[复制链接]
求职 : 数据库管理员
招聘 : Java研发
认证徽章
论坛徽章:
6350
ITPUB9周年纪念徽章
日期:2014-05-02 10:36:402011新春纪念徽章
日期:2014-12-29 12:11:142010广州亚运会纪念徽章:卡巴迪
日期:2014-08-06 08:44:252012新春纪念徽章
日期:2014-12-29 12:11:142013年新春福章
日期:2014-12-29 12:11:14马上有车
日期:2014-12-29 12:11:14马上有房
日期:2014-12-29 12:11:14马上有钱
日期:2014-12-29 12:11:14马上有对象
日期:2014-12-29 12:11:14马上加薪
日期:2014-12-29 12:11:14
发表于 2014-3-28 17:20 | 显示全部楼层 |阅读模式
本帖最后由 2009532140 于 2014-4-16 17:07 编辑

想跟各位oracle 开发版的大师们学学SQL 调优技术,有几个疑问。特别是问题三,如何定位sql 执行计划中可以的部分.



1:做过oracle DBA 的应该都查看过某个SQL 的执行计划,关于看SQL 的执行计划你都用过什么方式呢?

2:你觉得哪种方式查看的计划最为准确?为什么?能否给出例子。

3:作为DBA 来说,很可能对业务不甚了解,再加上业务的繁杂可能导致要DBA 帮助优化的SQL 可能是上百行,有丰富经验的你来说,如何快速定位一个SQL 性能问题的关键部分?
例如:http://www.itpub.net/forum.php?m ... ra=pageD1%3D&page=1
这位楼主的SQL ,性能问题可能出在哪里?为什么?


活动时间:2014年3月31日-4月15日


活动奖励:我们会在活动结束后随机抽取5位网友赠送马上系列徽章任意一枚!


获奖:dingjun123oracle_cjqq262420958iongxiaolhqmccn
论坛徽章:
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
发表于 2014-3-28 19:12 | 显示全部楼层
NL,一堆UNIQUE SCAN,基本不用管了

剩下的可疑部分只有INDEX FULL SCAN,第4行的AP_INVOICES_ALL 到底返回多少行,以及AP_UNAPPLY_PREPAYS_V 视图的第5个是否有问题

AP_INVOICES_ALL 应该不止3行啊,驱动INDEX FULL SCAN肯定很多次。。。

使用道具 举报

回复
论坛徽章:
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
发表于 2014-3-28 19:15 | 显示全部楼层
看执行计划最准的是用DBMS_XPLAN.DISPLAY_CURSOR,可以看到执行后的每步骤的统计,比如starts,e-rows和a-rows的差别,一看到starts特高的,或者starts很高,访问不高效的,肯定想办法处理,还有a-time是很准确的,看到每步的消耗时间。缺点是,执行很慢的语句,也不会用着玩意了。。。

那只能用普通的,比如autotrace traceonly exp,explain plan ....来看,先大体看看哪步可能有问题,自己根据谓词手动估算实际的基数与估算基数的差别。。。。

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2014-3-28 20:25 | 显示全部楼层
正在执行的sql,一般:
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_ID => 'xxx') FROM DUAL;
够详细了

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2014-3-28 20:29 | 显示全部楼层
历史的一般是
1.在DBA_HIST_SQLTEXT拿到sql_id,
然后:  
2.SELECT * FROM TABLE(DBMS_XPLAN.display_awr(sql_id => '',format => 'ALL')
3.根据2得到可以有不同的plan_hash_value
SELECT * FROM DBA_HIST_SQLSTAT T
   WHERE T.plan_hash_value IN ();
--根据SQL_ID和plan_hash_value可以得到SNAP ID
--SQLID +PLAN_HASH_VALUE组合发生变化对应的SNAPID,就是执行计划变化的时间点
  SELECT T.begin_interval_time,T.*
    FROM DBA_HIST_SNAPSHOT T
   WHERE T.snap_id = xxx;

使用道具 举报

回复
认证徽章
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:332013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02秀才
日期:2017-03-20 13:42:20秀才
日期:2017-07-11 13:54:02
发表于 2014-3-28 20:31 | 显示全部楼层
如果是单纯的优化SQL,主要是看对应的SQL的执行计划是否最优(是否用了合适的索引,执行路径是否合适等)。
或者可以借助中间表,静态表等。
另外,优化SQL也完全可以从优化业务流程着手。

使用道具 举报

回复
论坛徽章:
12
ITPUB社区12周年站庆徽章
日期:2013-08-26 10:32:46优秀写手
日期:2013-12-24 06:00:12问答徽章
日期:2014-02-13 15:15:452014年新春福章
日期:2014-02-18 16:47:53马上加薪
日期:2014-02-18 16:47:53马上有车
日期:2014-03-27 15:59:39马上有车
日期:2014-04-08 13:08:04马上有钱
日期:2014-04-10 12:55:42
发表于 2014-3-28 20:57 | 显示全部楼层
1.看SQL执行的时间,长的话explain plan for 短的话,执行,从游标里面取
2.执行过的从游标里面取的最准
3. 4、5、19是疑点。

使用道具 举报

回复
论坛徽章:
540
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2014-3-28 22:08 | 显示全部楼层
Troubleshooting Oracle Performance(Oracle性能诊断艺术)第六章完整又详细地回答了这些问题。

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
认证徽章
论坛徽章:
6350
ITPUB9周年纪念徽章
日期:2014-05-02 10:36:402011新春纪念徽章
日期:2014-12-29 12:11:142010广州亚运会纪念徽章:卡巴迪
日期:2014-08-06 08:44:252012新春纪念徽章
日期:2014-12-29 12:11:142013年新春福章
日期:2014-12-29 12:11:14马上有车
日期:2014-12-29 12:11:14马上有房
日期:2014-12-29 12:11:14马上有钱
日期:2014-12-29 12:11:14马上有对象
日期:2014-12-29 12:11:14马上加薪
日期:2014-12-29 12:11:14
发表于 2014-3-31 13:35 | 显示全部楼层
dingjun123 发表于 2014-3-28 19:12
NL,一堆UNIQUE SCAN,基本不用管了

剩下的可疑部分只有INDEX FULL SCAN,第4行的AP_INVOICES_ALL 到底返 ...

是在谓词部分出现了不止三次?

使用道具 举报

回复
论坛徽章:
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
发表于 2014-3-31 13:37 | 显示全部楼层
2009532140 发表于 2014-3-31 13:35
是在谓词部分出现了不止三次?

不是,是实际执行不止3次,那统计信息估计有问题。。。

使用道具 举报

回复

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

本版积分规则 发表回复

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