执行计划的6种查看方法.docx
- 文档编号:23797066
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:12
- 大小:277.67KB
执行计划的6种查看方法.docx
《执行计划的6种查看方法.docx》由会员分享,可在线阅读,更多相关《执行计划的6种查看方法.docx(12页珍藏版)》请在冰豆网上搜索。
执行计划的6种查看方法
查看SQL的6种执行计划
1.获取执行计划的6种方法
1.explainplanfor获取;
2.setautotraceon;
3.statistics_level=all;
4.通过dbms_xplan.display_cursor输入sql_id参数直接获取;
5.10046trace跟踪;
6.awrsqrpt.sql;
1.1explainplanfor
步骤1:
explainplanfor"你的SQL"
步骤2:
select*fromtable(dbms_xplan.display());
事例:
优点:
无需真正执行,快捷方便
缺陷:
1.没有输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况);
2.无法判断是处理了多少行;
3.无法判断表被访问了多少次。
因为这种执行计划,不会执行sql,只是通过采集表的信息,对sql进行了预估的一个计划。
1.2setautotraceon
步骤1:
setautotraceon
步骤2:
在此处执行你的SQL即可,后续自然会有结果输出
有以下几种情况可控选择,一般都选择第二种,我们不需要结果,只看计划。
setautotraceon:
得到执行计划,输出运行结果;
setautotracetraceonly:
得到执行计划,不输出运行结果;
setautotracetraceonlyexplain:
得到执行计划,不输出运行结果和统计信息部分,仅展现执行计划部分;
setautotracetraceonlstatistics:
不输出运行结果和执行计划部分,仅展现统计信息部分;
事例:
settimingon是否显示SQL执行时间,一般都显示。
altersystemflushshared_pool;
刷新共享池,我们知道共享池是编译解析执行sql的,同一个sql第二次执行的时候不会再进行解析编译,所以在看执行计划前都会先刷新共享池。
altersystemflushbuffer_cache;
刷新数据缓存区,我们读写都是先操作数据缓存区,如果有数据就不会去读磁盘,所以,要想看到准确的执行计划,需要刷新数据缓存区。
优点:
1.可以输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况);
2.虽然必须要等语句执行完毕后才可以输出执行计划,但是可以有traceonly开关来控制返回结果不打屏输出。
缺陷:
1.必须要等到语句真正执行完毕后,才可以出结果;
2.无法看到表被访问了多少次。
1.3statisticslevel=all
步骤1:
altersessionsetstatistics_level=all;
步骤2:
在此处执行你的SQL
步骤3:
select*fromtable(dbms_xplan.display_cursor(null,null,'allstatslast'));
事例:
Starts为该sql执行的次数。
E-Rows为执行计划预计的行数。
A-Rows为实际返回的行数。
A-Rows跟E-Rows做比较,就可以确定哪一步执行计划出了问题。
A-Time为每一步实际执行的时间(HH:
MM:
SS.FF),根据这一行可以知道该sql耗时在了哪个地方。
Buffers为每一步实际执行的逻辑读或一致性读。
Reads为物理读。
OMem:
当前操作完成所有内存工作区(WorkAera)操作所总共使用私有内存(PGA)中工作区的大小,这个数据是由优化器统计数据以及前一次执行的性能数据估算得出的
1Mem:
当工作区大小无法满足操作所需的大小时,需要将部分数据写入临时磁盘空间中(如果仅需要写入一次就可以完成操作,就称一次通过,One-Pass;否则为多次通过,Multi_Pass).该列数据为语句最后一次执行中,单次写磁盘所需要的内存大小,这个由优化器统计数据以及前一次执行的性能数据估算得出的
User-Mem:
语句最后一次执行中,当前操作所使用的内存工作区大小,括号里面为(发生磁盘交换的次数,1次即为One-Pass,大于1次则为Multi_Pass,如果没有使用磁盘,则显示OPTIMAL)
OMem、1Mem为执行所需的内存评估值,0Mem为最优执行模式所需内存的评估值,1Mem为one-pass模式所需内存的评估值。
0/1/M为最优/one-pass/multipass执行的次数。
Used-Mem耗的内存
优点:
1.可以清晰的从STARTS得出表被访问多少。
2.可以清晰的从E-ROWS和A-ROWS中得到预测的行数和真实的行数,从而可以准确判断Oracle评估是否准确。
3.虽然没有专门的输出运行时的相关统计信息,但是执行计划中的BUFFERS就是真实的逻辑读的多少。
缺陷:
1.必须要等到语句真正执行完毕后,才可以出结果。
2.无法控制记录输屏打出,不像autotrace有traceonly可以控制不将结果打屏输出。
3.看不出递归调用的次数,看不出物理读的多少(不过逻辑读才是重点)
1.4dbms_xplan.display_cursor输入sql_id
步骤1:
select*fromtable(dbms_xplan.display_cursor('0v2gk4ww8m40q'));
这个查询计划,我们必须知道SQL_ID,
select*fromv$sqla
whereupper(a.SQL_TEXT)like'SELECTA%'
orderbya.LAST_ACTIVE_TIMEdesc
优点:
1.知道sql_id立即可得到执行计划,和explainplanfor一样无需执行;
2.可以得到真实的执行计划。
缺陷:
1.没有输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况);
2.无法判断是处理了多少行;
3.无法判断表被访问了多少次。
1.510046TRACE
步骤1:
altersessionsetevents'10046tracenamecontextforever,level12';(开启跟踪)
步骤2:
执行你的语句
步骤3:
altersessionsetevents'10046tracenamecontextoff';(关闭跟踪)
步骤4:
找到跟踪后产生的文件
selectd.value||'\'||LOWER(RTRIM(i.INSTANCE,CHR(0)))||'_ora_'||p.spid
||'.trc'trace_file_name
from(selectp.spid
fromv$mystatm,v$sessions,v$processp
wherem.statistic#=1ands.sid=m.sidandp.addr=s.paddr)p,
(selectt.INSTANCE
FROMv$threadt,v$parameterv
WHEREv.name='thread'
AND(v.VALUE=0ORt.thread#=to_number(v.value)))i,
(selectvaluefromv$parameterwherename='user_dump_dest')d;
步骤5:
tkproftrc文件目标文件sys=nosort=prsela,exeela,fchela(格式化命令)
tkprofd:
\app\hengyun\diag\rdbms\orcl\orcl\trace\orcl_ora_7448.trcd:
\10046.txtsys=nosort=prsela,exeela,fchela
执行这个的时候,要退出sqlplus
在你指定的目录下会生成执行计划
优点:
1.可以看出SQL语句对应的等待事件
2.如果SQL语句中有函数调用,SQL中有SQL,将会都被列出,无处遁形。
3.可以方便的看出处理的行数,产生的物理逻辑读。
4.可以方便的看出解析时间和执行时间。
5.可以跟踪整个程序包
缺陷:
1.步骤繁琐,比较麻烦
2.无法判断表被访问了多少次。
3.执行计划中的谓词部分不能清晰的展现出来。
1.6awrsqrpt.sql
步骤1:
@?
/rdbms/admin/awrsqrpt.sql
步骤2:
选择你要的断点(beginsnap和endsnap)
步骤3:
输入你的sql_id
之后就可以去你的目录下看执行计划了。
2.适用场合分析
1.如果某SQL执行非常长时间才会出结果,甚至慢到返回不了结果,这时候看执行计划就只能用方法1;
2.跟踪某条SQL最简单的方法是方法1,其次就是方法2;
3.如果想观察到某条SQL有多条执行计划的情况,只能用方法4和方法6;
4.如果SQL中含有多函数,函数中套有SQL等多层递归调用,想准确分析,只能使用方法5;
5.要想确保看到真实的执行计划,不能用方法1和方法2;
6.要想获取表被访问的次数,只能使用方法3;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 执行 计划 查看 方法
![提示](https://static.bdocx.com/images/bang_tan.gif)