DBMS_XPLAN

dbms_xplan能够自动查询plan_table中的最后一个执行计划

display:显示最后一次执行计划
display_cursor:显示内存中游标的内容和执行计划(可以指定sql_id)
display_awr:显示保存在awr中的sql的内容和执行计划
display_sqlset:显示一个sql调优集的内容和执行计划


SQL> explain plan for select * from a;

Explained.


SQL> set linesize 130
SQL> set pagesize 0
SQL> select * from table(DBMS_XPLAN.DISPLAY);

Plan hash value: 2248738933

--------------------------------------------------------------------------
| Id  | Operation	  | Name | Rows  | Bytes | Cost (%CPU)| Time	 |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |	 |  7340K|   266M| 11968   (1)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| A	 |  7340K|   266M| 11968   (1)| 00:00:01 |
--------------------------------------------------------------------------

8 rows selected.

select * from table(dbms_xplan.display());

select * from table(dbms_xplan.display(table_name=>‘PLAN_TABLE’,statement_id=>null,format=>‘ALL’));
用explain plan解释一个SQL,相关信息会默认被放到一个一个叫PLAN_TABLE的全局临时表中。可以用这个来查看。
参数:
table_name,默认’PLAN_TABLE’,如果别的一个表跟PLAN_TABLE有一样的表结构,也可以读取里面的信息。
statement_id 默认null,即查该session最后的一条explain plan解释的语句。
format 默认’TYPICAL’,全部是’BASIC’,‘TYPICAL’,‘ALL’,ALL的时候会显示PROJECTION, ALIAS and information about REMOTE SQL if the operation is distributed。其实除了指定这3个级别外,显示什么信息也可以再通过后面的备注(减号代表去除相关信息)
‘ALL -PROJECTION -NOTE’ #ALL级别,但不要投射与NOTE信息
‘BASIC ROWS’ --BASE下本来没有ROWS信息,我们也可以给它加上。
还有其他选项,如:
outline

filter_perds 默认null ,filter_preds=>‘plan_id =32’ 可以通过plan_table中的字段,限制输出什么信息,就如同where条件。
每个连上来的用户都可以使用plan_table,不用特别的权限,也不用读取诸如v$plan这样的视图。
不会实际执行SQL,也不会在shared pool上生成该SQL的cursor,是生成了一个cursor不过是带上explain plan for字眼的,而没有独立的该sql的cursor产生。

2.查看一个shared pool中的cursor的执行计划

select * from table(dbms_xplan.display_cursor()); --展示该session的最后一条SQL的执行计划,只在sqlplus中合适。
select * from table(dbms_xplan.display_cursor(‘fb8szhn9h5r95’));
select * from table(dbms_xplan.display_cursor(‘fb8szhn9h5r95’,0,‘TYPICAL’));
#第一种展示session最后一条SQL的执行计划,在plsql developer中不合适,这很可能是因为,plsql developer每执行完一个select后,就会默认开启一个新的事务,会执行begin :id := sys.dbms_transaction.local_transaction_id; end;,所以这才是在plsql developer中的最后一条语句。
#从shared pool中读取cursor,并结合V S Q L P L A N S T A T I S T I C S A L L , V SQL_PLAN_STATISTICS_ALL, V SQLPLANSTATISTICSALL,VSQL, and VKaTeX parse error: Expected 'EOF', got '#' at position 22: …AN等视图,将执行计划展现。 #̲如果缺乏权限,可以SELECT…SQL_PLAN_STATISTICS_ALL,V S Q L , a n d V SQL, and V SQL,andVSQL_PLAN都授予。
#格式,其中sql_id与child_no唯一标识某个cursor。
sql_id 指定位于library cache执行计划中SQL父游标,如果不指定就返回session执行的最后一条SQL的sql_id。
child_number 默认是0,如果是null,则返回sql_id所指父游标下的所有子游标的执行计划。
format 控制SQL语句执行计划的输出部分,即哪些可以显示哪些不显示。(默认TYPICAL),可以参考display(),也是basic,typical,all。

3.对于有详细实时执行信息的SQL

除此之外当在开启statistics_level=all时或使用gather_plan_statistics提示时,会用另外一个表,详细地记录运行时执行计划与信息。
alter session set statistics_level=all; --也可以alter system
select /*+ gather_plan_statistics / /fwy1806/ from t1 where rownum<30;
详细地查看执行计划

display_cursor比display()还多了一些东西,在详细收集模式下,还可以加下面的选项。
IOSTATS:会展示该SQL的累计IO统计信息,加了last就显示最后一个。
MEMSTATS:只有开启了PGA自动内存管理,即pga_aggregate_target不是0,我们才能使用这项,会展示使用了多少memory,多少bytes被交换到磁盘,一般来说用了hash-join,sort,group by等比较需要内存的操作才会收集。
ALLSTATS:是’IOSTATS MEMSTATS’的同义词。
LAST:默认地展示都是该游标的累积统计信息,加了LAST才会显示最后一个。
RUNSTATS_TOT --为了向后兼容,相当于IOSTATS
RUNSTATS_LAST --为了向后兼容,相当于IOSTATS LAST

查看该游标最后一次的实际统计信息执行计划
select * from table(dbms_xplan.display_cursor(‘fb8szhn9h5r95’,null,‘allstats last’));
会将该游标的累积执行信息列出,例如游标执行过两次后,starts,A-Rows,buffers也是上面的两倍
select * from table(dbms_xplan.display_cursor(‘fb8szhn9h5r95’,null,‘allstats’));
最详细,汇集了普通模式的all与详细模式的allstats,而且将默认不显示的outline信息也显示出来。
select * from table(dbms_xplan.display_cursor(‘fb8szhn9h5r95’,null,‘all allstats last outline’));
select * from table(dbms_xplan.display_cursor(‘fb8szhn9h5r95’,2,‘all allstats last outline’)); --加上child_no
Starts为该sql执行的次数。
E-Rows为执行计划预计的行数。
A-Rows为实际返回的行数。A-Rows跟E-Rows做比较,就可以确定哪一步执行计划出了问题。
A-Time为每一步实际执行的时间(HH:MM:SS.FF),根据这一行可以知道该sql耗时在了哪个地方。
Buffers为每一步实际执行的逻辑读或一致性读。
Reads为物理读。
OMem、1Mem为执行所需的内存评估值,0Mem为最优执行模式所需内存的评估值,1Mem为one-pass模式所需内存的评估值。
0/1/M 为最优/one-pass/multipass执行的次数。

4. display_awr 展示awr信息库中的执行计划

SELECT * FROM table(DBMS_XPLAN.DISPLAY_AWR(‘09tr40mjc8vg5’));
SELECT * FROM table(DBMS_XPLAN.DISPLAY_AWR(‘3hxb21q9h4t40’,1367077082,null,‘all’));

sql_id --输入存储在AWR中的sql_id,你可以先查dba_hist_sql_plan,dba_hist_sqltext,看看某个语句属于什么sql_id。
plan_hash_value --如果是null的话该sql_id所有的执行计划会输出。默认null
db_id --如果忽略,默认就是当前的database
format --参考display(),还是’basic’,‘typical’,'all’这样,默认typical

1.请确保AWR已经运行。
2.权限:用户需要select on DBA_HIST_SQL_PLAN,DBA_HIST_SQLTEXT,V$DATABASE的权限。
3.查sql_id,根据sql文本查出sql_id ,可以从dba_hist_sqltext查。
4.来源:展示的执行计划的信息,来源于dba_hist_sql_plan。
5.详细:是否可以用allstats这样查看更详细的执行计划,这可能得取决于你当时的sql有没开启手机详细运行时统计信息。

  1. display_sqlset 展示存储在sql turning set中的sql的执行计划。
    sqlset_name specified the name of the SQL tuning set.
    sql_id 输入存储在sql tuning set中的sql_id,可以从DBA_SQLSET_PLANS看。
    plan_hash_value 如果是null,则该sql_id的所有执行计划会被输出。默认null。
    format 参考display(),也是’basic’,‘typical’,‘all’,默认’typical’
    sqlset_owner Specifies the owner of the SQL tuning set 默认当前用户
    SELECT * FROM table(DBMS_XPLAN.DISPLAY_SQLSET(‘fwy_sqlset’,‘3hxb21q9h4t40’,1367077082,‘all’,‘fwy’));

6. display_sql_plan_baseline 展示存储在SPM中的SQL执行计划

查看SPM中baseline的执行计划:DBMS_XPLAN.DISPLAY_sql_plan_baseline
SELECT * FROM table(DBMS_XPLAN.DISPLAY_sql_plan_baseline(‘SQL_a074c4f7bacd50da’,‘SQL_PLAN_a0x64yyxcun6u06957ae0’,‘ALL’));
这样看也行,就会看这个sql_handle下所有执行计划
SELECT * FROM table(DBMS_XPLAN.DISPLAY_sql_plan_baseline(sql_handle => ‘SQL_351fadd1a0ec16be’ ));
SELECT * FROM table(DBMS_XPLAN.DISPLAY_sql_plan_baseline(plan_name => ‘SQL_PLAN_a0x64yyxcun6u06957ae0’,‘ALL’));

格式:
sql_handle SPM中的sql_handle相当于v s q l 中的 s q l i d ,默认 N u l l p l a n n a m e S P M 中唯一标识一个执行计划,就像 v sql中的sql_id,默认Null plan_name SPM中唯一标识一个执行计划,就像v sql中的sqlid,默认NullplannameSPM中唯一标识一个执行计划,就像vsql中的plan_hash_value。默认null。如果是null,那么上面的sql_handle就必须指定。
format:参考display(),默认typical。
执行计划来源于:DBA_SQL_PLAN_BASELINES

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韶博雅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值