学习Oracle Explain Plan

上一篇 / 下一篇  2008-07-07 23:32:40 / 个人分类:ORACLE

最近一直在Oracle培训,《SQL Tuning》这们课讲到sql语句的执行计划有几种获得方法,以前都是野路子出身,觉得什么都是差不多那样,培训完后才发现和平年代还是正规军厉害啊!总结一下获得sql语句执行计划的4种方法如下:

1.     Explain Plan Command

     数据库将执行计划信息保存在一定结构的表里。执行创建保存Explain plan相关的脚本$ORACLE_HOME/rdbms/admin/utlxpls.sql,生成保存explain plan的默认表plan_table

      使用”explain plan”命令统计sql语句的执行计划的步骤如下:

      步骤1,执行如下命令,explain需要生成执行计划的sql语句:

      SQL>Explain plan<set statement_id = ‘text’><into your plan table>forstatement

      注:

             蓝色部分可以省略,红色部分为具体sql语句

             set statement_id = ‘text’” ,其中statement_idplan_table表的字段名,标记该条sqlid信息

             into your plan table”,默认的是plan_table

      

      步骤2,生成执行计划后,可以使用如下命令进行查看具体的执行计划:

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

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

      

      通过explain plan command获得sql语句的执行计划,最大的优点是不用直接运行sql语句,避免了由于返回结果时间过长过多带来的等待。

      

2.     V$SQL_PLAN

使用dbms_xplan.display_cursor的包从v$sql_plan里查看sql语句的执行计划

SQL>select plan_table_output from table(dbms_xplan.display_cursor(‘sql_id’));

      注意:

      sql_id可以通过v$sql视图获得

      另外,v$sql_plan_statistics_all记录着sql语句的统计信息,也可以通过该视图查看到历史sql的执行计划。

 

      通过v$视图查看数据库中所有sql语句的执行计划,比不同时间场景下相同sql的执行计划和统计信息的差异,以便对出现问题sql的原因进行定位!

 

3.     AWRRPT

      通过AWRRPT显示sql语句的执行计划  

      步骤1,执行sql语句

            

SQL> select table_name from user_tables where table_name = 'TEST';

 

TABLE_NAME

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

TEST

 

步骤2,确认sql语句的sql_id

            

SQL> select sql_id, sql_text from v$sql where sql_text like 'select table_name from user_tables%';

SQL_ID          SQL_TEXT

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

3bqanqwr3515p  select table_name from user_tables where table_name = 'TEST'

 

步骤3,确认该sql是否被记录在dba_hist_sqltext

      

SQL> select sql_id,sql_text from dba_hist_sqltext where sql_id = '3bqanqwr3515p';

 

未选定行

 

如果没有记录,手工设置AWRsnapshot,sql信息记录在dba_hist_sqltext

SQL> exec dbms_workload_repository.create_snapshot();

PL/SQL过程已成功完成。

SQL> select sql_id,sql_text from dba_hist_sqltext where sql_id = '3bqanqwr3515p';

 

SQL_ID         SQL_TEXT

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

3bqanqwr3515p select table_name from user_tables where table_name = 'TEST'

 

步骤4,使用dbms_xplan.display_awr的包显示指定sql_id的执行计划

SQL> select    plan_table_output    from table(dbms_xplan.display_awr('3bqanqwr3515p'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
省去执行计划

 

4.     SQL*Plus AUTOTRACE

      命令格式:

      SQL>SET AUTOTRACEOFF/ON/TRACEONLY {EXPLAIN/STATISTICS}

      ON                打开autotrace执行sql语句返回结果,且自动显示执行计划和统计信息

      Traceonly     打开autotrace执行sql语句,仅返回结果记录数,且自动显示执行计划和统计信息

      Explain         仅显示explain,不显示statistics

      Statistics      仅显示statistics,不显示explain

      

      注意:红色部分是可选项,默认是显示explainstatistics

              执行”set autotrace option”后,运行的sql在返回结果结束后根据设置显示该条sql的执行计划或统计信息


TAG:

引用 删除 boson   /   2008-09-22 15:23:24
10046
引用 删除 boson   /   2008-09-22 15:20:47
还有一定很重要,哪个是需要实际执行SQL的,那些不是
引用 删除 Guest   /   2008-08-21 20:40:44
5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-12  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 1516
  • 日志数: 650
  • 影音数: 1
  • 建立时间: 2008-01-18
  • 更新时间: 2008-08-27

RSS订阅

Open Toolbar