dbms_xplan.display_awr方式获取执行计划的实验和之前的误导
来源:互联网 发布:java String 判断相等 编辑:程序博客网 时间:2024/05/18 00:58
《查看Oracle执行计划的几种常用方法-系列1》(http://blog.csdn.net/bisal/article/details/38919181)这篇博文中曾提到一个隐藏问题:
“隐藏问题2:
实验这部分内容发现使用select * from table(dbms_xplan.display_awr('sql_id'));并没有结果,@黄玮老师说有可能是AWR收集的是top的SQL,有可能测试用的SQL不是most intensive SQL,但我是用alter system flush shared_pool后执行的手工采集快照,还是未被AWR抓到,比较奇怪的问题,这个也会在另一篇博文中仔细说明。”
背景是:
“select * from table(dbms_xplan.display_awr('sql_id'));
(1)是使用explain plan for +SQL作为前提,(2)和(3)的前提则是SQL的执行计划还在共享池中,具体讲是在库缓存中。如果已经被age out交换出共享池,则不能用这两种方法了。若该SQL的执行计划被采集到AWR库中,则可以用(4)上述SQL来查询历史执行计划。”
即使用这条SQL可以查看AWR库中保存的执行计划。但我尝试用dual表做实验,发现并没有被AWR库保存他的执行计划(http://www.itpub.net/forum.php?mod=viewthread&tid=1886046&extra=)。
实验:
1. 创建测试表:
2. 查询Shared Pool中是否已经缓存了select count(*) fromawr_tbl的执行计划:
3.手工收集AWR报告,清空Shared Pool缓冲池:
看到缓冲区被清空了,刚才可以从v$sqlarea中查询的SQL信息已经删除了。
4. 使用上面提到的“select * from table(dbms_xplan.display_awr('sql_id'));”看看AWR中保存的SQL信息:
对于@dbsnake说的dbms_xplan.display_awr('sql_id')和dbms_xplan.display_cursor的区别是不能显示谓词信息,是因为从V$SQL_PLAN导入AWR基表WRH$_SQL_PLAN时未将谓词字段access_predicates和filter_predicates导入,也做了一个实验:
select count(*) from sys_awr where object_name='SYS_AWR';语句,在V$SQL_PLAN中存在谓词信息:“OBJECT_NAME=”='SYS_AWR',但从WRH$_SQL_PLAN中看这两个字段是空的:
总结:
(1) select * from table(dbms_xplan.display);
(2) select * from table(dbms_xplan.display_cursor(null, null, 'advanced'));
(3) select * from table(dbms_xplan.display_cursor('sql_id/hash_value', child_cursor_number, 'advanced'));
(4) select * from table(dbms_xplan.display_awr('sql_id'));
以上是使用dbms包查看执行计划的四种方法,其中:
(1)需要配合explain plan使用。
(2)、(3)需要SQL仍在Shared Pool中。
(4)需要AWR库保存该SQL信息。另外,不会显示谓词信息。
针对不同的场景选择不同的读取执行计划的方法即可。
实验过程中我曾用select * from dual作为测试SQL,但未得到如上结果,经@黄玮大师点播,认为可能是对于DUAL表的操作Oracle内部不是像正常表检索的方式来执行的,有机会可以探究。(http://www.itpub.net/forum.php?mod=viewthread&tid=1886046&extra=)
- dbms_xplan.display_awr方式获取执行计划的实验和之前的误导
- dbms_xplan.display_cursor 获取执行过的sql的执行计划
- dbms_xplan.display_cursor 获取执行过的sql的执行计划
- dbms_xplan包-获取执行计划
- dbms_xplan.display_cursor查看低效的执行计划
- DBMS_XPLAN包获取sql执行计划
- [Oracle]如何查看SQL的执行计划 - DBMS_XPLAN Package
- 通过dbms_xplan.display_cursor识别低效的执行计划
- 巧用DISPLAY_AWR函数与dba_hist_sqlstat结合查询SQL语句在指定节点指定时间范围内的历史执行计划
- dbms_xplan.display_cursor 查看已执行SQL的执行计划(10g后)
- DBMS_XPLAN.DISPLAY_CURSOR()看执行计划
- oracle 执行计划获取的几种方式
- 获取执行计划的方法
- 使用dbms_xplan工具查看执行计划
- 使用dbms_xplan工具查看执行计划
- 获得执行计划方法六-dbms_xplan.diskplay_cursor
- 获得执行计划方法六-dbms_xplan.diskplay_cursor
- 使用dbms_xplan包查看执行计划
- java环境变量 Path 与CLASSPATH
- R:数据框
- 管理看板-DBD面板展现在首页
- 程序员面试常问到的区别
- Python之美[从菜鸟到高手]--NotImplemented小析
- dbms_xplan.display_awr方式获取执行计划的实验和之前的误导
- Unity3D游戏开发最佳实践20技巧(三)
- 嵌入式软件工程师 面试题
- Juce源码分析(三)数据的原子操作
- Android编程之仿微信显示更多文字的View
- 《c程序设计语言》读书笔记
- mysql乱码处理
- Ubuntu上搭建Hadoop环境(单机模式+伪分布模式)
- njtyjsjk