最权威Oracle获取SQL语句执行计划大全(一)

2015-07-16 12:09:00 · 作者: · 浏览: 1

1、查询v$sql_plan:


SQL> col "Query Plan_Table" format a100


SQL> select id,lpad(' ', 2*(level-1))||operation||''||options||' '||object_name||' '||decode(id, 0, 'Cost='||cost) "QueryPlan_Table"


? ? ? fromv$sql_plan


? ? ? startwith id = 0


? ? ? ? andsql_id = '&&sql_id'


? ? ? ? andplan_hash_value = &&plan_hash


? ? connect byprior id = parent_id


? ? ? ? andsql_id = '&&sql_id'


? ? ? ? andplan_hash_value = &&plan_hash;


--注::SQL_ID可查v$sqltext和dba_hist_sqltext,也可通过其他途径获得。


?


2、通过包DBMS_XPLAN


1)DISPLAY


SQL>explain plan for select * from t_users whereuser_id='TEST';


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


SQL>select * fromtable(dbms_xplan.display(null,null,'BASIC ROWS BYTES'));


--注:


1.TABLE_NAME:存储查询计划的表名,默认值为PLAN_TABLE。


2.STATEMENT_ID :SQL 语句ID。可在执行ExplainPlan 命令时,通过SetStatement_


id 子句来指定。如为NULL,则取最近一条被解释的语句。


3.FORMAT:输出格式。在DISPLAY 函数中,有以下预定义格式选:


1)'BASIC' :基本格式。输出的内容最少,仅输出查询计划中每个操作的ID、名称和选项及操作对象名。


2)'TYPICAL':典型格式。除了基本格式中的内容外,还输出每个操作的记录行数、


字节数、代价和时间,以及相关的提示信息(如远程SQL、优化器建议等)。如


存在谓词,还输出每个操作中的过滤条件和访问条件。此外,如涉及分区表,还输出分区裁剪信息;如涉及并行查询,还输出并行操作信息(如表队列信息、并行查询分布方式等)。为默认格式。


3)'SERIAL':串行执行格式。这种格式和典型格式的输出内容基本一致,不同之处在于,对并行查询,它不会输出相关的并行内容。


4)'ALL':完全格式。输出的内容相对完整。除了典型格式的内容以外,还会输出字段投影信息和别名信息。


此外,用户还可通过在格式化字符串中添加或屏蔽一些关键词进行细化输出,


例如:“BASICROWS”,“TYPICAL-PREDICATE”等


1)ROWS:优化器估算出的记录行数;


2)BYTES:优化器估算出的字节数;


3)COST:优化器估算出的代价;


4)PARTITION:分区裁剪;


5)PARALLEL:并行查询;


6)PREDICATE:谓词;


7)PROJECTION:字段投射;


8)ALIAS:别名;


9)REMOTE:分布式查询信息;


10)NOTE:相关注释信息。


2)DISPLAY_CURSOR


SQL>select /*+gather_plan_statistics*/* fromt_users where user_id='TEST';


SQL>select * fromtable(dbms_xplan.display_cursor(null,null,'BASIC LAST ALLSTATS'));


--注:


1.DISPLAY_CURSOR 函数可以显示内存中一个或者多个游标的执行计划;


2.用户须对视图V$SQLV、$SQL_PLAN 和V$SQL_PLAN_STATISTICS_ALL 的SELECT有权限;


3.参数:


1)SQL_ID:如果没有指定SQL_ID(指定NULL),则默认会显示当前会话中最后一条执行的SQL 语句。


2)CURSOR_CHILD_NO:语句的子游标序号,如果不指定,则会显示该语句的所有子游标的执行计划。


3)FORMAT:格式化控制字符串。DISPLAY 函数的格式化控制字符串的所有选项都适用于DISPLAY_CURSOR 函数。如运行语句时通过GATHER_PLAN_STATISTICS或设置系统参数STATISTICS_LEVEL 为“ALL”收集语句运行的性能统计数据,则在细化选项中还有额外的选项,以选择是否输出这些数据。


4)IOSTATS:是否输出计划的输入输出(IO)统计数据;


5)MEMSTATS :在启用了PGA 自动管理的情况下,是否输出计划的输入内存统计数据(内存使用量、内存读次数等);


6)ALLSTATS:包含了IOSTATS和MEMSTATS 的全部内容;


7) LAST :以上三个选项输出的是该游标所有执行所产生的数据的总和。也可增加LAST选项以限定仅显示最后一次运行的统计数据。


此外,还有一些选项可用于该函数的输出控制:


8)'ADVANCED' :高级格式。高级格式除了会输出完全格式中的所有内容外,还会视情况输出绑定变量窥视信息和计划概要信息;


9) OUTLINE:是否以提示方式显示计划概要;


10)PEEKED_BINDS:是否显示绑定变量窥视信息;


11)BUFFSTATS:是否显示内存读次数(包括一致性读和当前读次数),该信息为IOSTATS 的一部分;


12)PLAN_HASH:是否显示计划的哈希值,该选项同样适用于DISPLAY函数。


3)DISPLAY_AWR


SQL>select sql_id, to_char(substr(sql_text,0,2000))


? ? ? fromdba_hist_sqltext


? ? whereupper(sql_text) like 'SELECT * FROM TEST%';


SQL>select * fromtable(dbms_xplan.display_awr('&sql_id'));


--注:


1.DISPLAY_AWR 函数显示存储在AWR历史数据的执行计划。


2.须对以下视图有SELECT权限:DBA_HIST_SQL_PLAN 和DBA_HIST_SQLTEXT。


3.参数:


1)SQL_ID :可以从DBA_HIST_SQL_PLAN.SQL_ID或DBA_HIST_SQLTEXT.SQL_ID 获得,该参数必须指定非空值,没有默认值;


2)PLAN_HASH_VALUE :如果该参数未指定或为NULL,则会显示语句的所有执行计划;


3)DB_ID:指定显示哪个数据库的执行计划,默认为本地数据库ID。页可将其他数据库的AWR导入本地库进行分析。


4)FORMAT:格式化控制字符串。与DISPLAY的相同选项类似。


?


4)DISPLAY_SQLSET


SQL>declare


2 ss_name varchar2(60);


3 begin


4 ss_name :=dbms_sqltune.create_sqlset();


5 dbms_sqltune.capture_cursor_cache_sqlset(ss_name,600,100);


6 dbms_output.put_line(ss_name);


7 end;


8 /


SQL>select sqlset_name,sql_id,sql_te