最全的display_cursor执行计划查看使用方法

1.解释并查看sql文本的执行计划

explain plan for select 3+5 from dual;

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$SQL_PLAN_STATISTICS_ALL,  V$SQL,
and V$SQL_PLAN等视图,将执行计划展现。

#如果缺乏权限,可以SELECT privilege on V$SQL_PLAN_STATISTICS_ALL,V$SQL, and V$SQL_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

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

| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads |

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

| 0 | SELECT STATEMENT | | 1 | | | 3 (100)| | 25 |00:00:00.01 | 3 | 2 |

|* 1 | COUNT STOPKEY | | 1 | | | | | 25 |00:00:00.01 | 3 | 2 |

| 2 | TABLE ACCESS FULL| T1 | 1 | 25 | 54400 | 3 (0)| 00:00:01 | 25 |00:00:00.01 | 3 | 2 |

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

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有没开启手机详细运行时统计信息。


5. 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$sql中的sql_id,默认Null

plan_name  SPM中唯一标识一个执行计划,就像v$sql中的plan_hash_value。默认null。如果是null,那么上面的sql_handle就必须指定。

format:参考display(),默认typical。

执行计划来源于:DBA_SQL_PLAN_BASELINES

时间: 2024-10-09 09:33:43

最全的display_cursor执行计划查看使用方法的相关文章

oracle里的执行计划-查看

内容主要来自看书学习的笔记,如下记录了常见查询执行计划的方法. 2.2 如何查看执行计划1.explain plan2.dbms_xplan包3.autotrace4.10046事件5.10053事件6.awr/statspack报告(@?/rdbms/admin/awrsqrpt)7.脚本(display_cursor_9i.sql) 2.2.1 explain planexplain plan for sqlselect * from table(dbms_xplan.display);SQ

Mysql优化之执行计划查看

我们经常说到mysql优化,优化中一种常见的方式就是对于经常查询的字段创建索引.那么mysql中有哪些索引类型呢? 一.索引分类1.普通索引:即一个索引只包含单个列,一个表可以有多个单列索引 2.唯一索引:索引列的值必须唯一,但允许有空值 3.复合索引:即一个索引包含多个列 4.聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式.具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行. 5.非聚簇索引:不

数据库-Oracle通过执行计划查看查询语句是否使用索引【转】

1.生成执行计划 explain plan for select * from t_call_records where t_bjhm='123456' 备注:explain plan for后面为要生成执行计划的查询语句 2.查看执行计划结果 select * from table(dbms_xplan.display) 如上图所示,TABLE ACCESS FULL为全表扫描; 为t_bjhm列加上索引后生成执行计划并查看结果: 如上图所示,index range scan为索引范围扫描;

oracle 执行计划的获取方法

1.用explain plan for来获取执行计划 explain plan for <sql>; select * from table(dbms_xplan.display()); 结果如下: --------------------------------------------------------------------------------------------------------------------- 优点 不需要真实执行sql,方便快捷 缺点 这里的执行计划并不

查看执行计划

1.工具介绍 总结:单纯估算用autotrace,真实调优用DBMS_XPLAN带参数 1.explain 因为绑定变量的原因,这个只能是估算 explain plan for select 3+5 from dual; select * from table(dbms_xplan.display()); select * from table(dbms_xplan.display(table_name=>'PLAN_TABLE',statement_id=>null,format=>'

oracle如何查看执行计划

1.在PL/SQL Developer中得到一个SQL的执行计划 输入想要查看执行计划的目标SQL,再按一下快捷键F5就可以了.2.explain plan 命令 explain plan for + 目标SQL select * from table(dbms_xplan.display)3. DBMS_XPLAN 包 1) select * from table(dbms_xplan.display_cursor(null,null,'advanced')) 它用于在SQLPLUS中查看刚刚

固定执行计划-使用coe_xfr_sql_profile

一.历史执行计划固定 历史的执行计划找到一个合理的执行计划进行绑定 1. 存在多个执行计划的语句,按照索引是比较合适的,FULL SCAN不合适 select * from scott.emp where deptno=30 select * from table(dbms_xplan.display_cursor('4hpk08j31nm7y',null)) SQL_ID 4hpk08j31nm7y, child number 0 -------------------------------

执行计划

1. 预执行 explain plan for 实际并没有执行SQL语句. SQL> explain plan for select ca_cstid from c_acc; Explained. SQL> @?/rdbms/admin/utlxpls PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------Plan hash value: 38275782

Oracle里的常见的执行计划

与表访问相关的执行计划 Oracle数据库里面与表访问有关的的两种方法:全表扫描和ROWID扫描.反应在执行计划上,与全表扫描对应的执行计划中的关键字是"TABLE ACCESS FULL",与ROWID扫描对应的执行计划中的关键字是"TABLE ACCESS BY USER ROWID"或"TABLE ACCESS BY INDEX ROWID". 我们来看一下与表访问的相关的执行计划,先执行如下SQL: SQL> select empn