Oracle10g里sql语句的执行计划

时间:2022-09-08 16:08:42

Oracle诊断或调优经常需要做的就是查看SQL语句的执行计划,很多时候我们需要得到sql语句在不同场景、不同时间段的执行计划。

Oracle10g平台以上获取sql语句的执行计划的方法如下:

1. Explain Plan Command

通过explain plan命令获得sql语句的执行计划。

explain plan的命令格式如下:
sql>Explain plan <set statement_id = ‘text’> <into your plan table> for sql statement;

注:
蓝色部分可以省略;红色部分为具体sql语句
"set statement_id = ‘text’” ,其中statement_id是plan_table.statement_id,标记该条sql的id信息;
"into your plan table”,默认的plan table是plan_table

运行上述命令生成sql的执行计划,然后可以通过如下2种方式在当前session内获取该sql语句的执行计划:

  • 运行Explain plan 脚本$ORACLE_HOME/rdbms/admin/utlxpls.sql
        eg: sql>@$ORACLE_HOME/rdbms/admin/utlxpls.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命令如下:
sql>select plan_table_output from table(dbms_xplan.display_cursor(‘sql_id’));

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

3. SQL*Plus AUTOTRACE

使用autotrace功能获得sql语句的执行计划。当然这需要建立autotrace相关的plan_table、synonym等。

建立autotrace方法如下:

1、cd @oracle_homerdbms/rdbms/admin
2、#sqlplus as system
3、sql>@utlxplan
4、sql>create public synonym plan_table for plan_table
5、sql>Grant all on plan_table to public;

autotrace命令格式:
SQL>SET AUTOTRACE OFF/ON/TRACEONLY {EXPLAIN/STATISTICS}

注意:红色部分是可选项。执行”set autotrace option”后,运行的sql在返回结果结束后根据参数设置显示该条sql的执行计划或统计信息。

不同选项说明如下:

SET AUTOTRACE ON 执行sql语句返回结果,且自动显示执行计划和统计信息
SET AUTOTRACE ON Explain 打开autotrace;仅显示执行计划,不显示统计信息
SET AUTOTRACE ON Statistics 打开autotrace;仅显示统计信息,不显示执行计划
SET AUTOTRACE Traceonly sql语句仅返回结果,且自动显示explain和statistics
SET AUTOTRACE OFF 当前session关闭autotrace

 

 

4. AWRRPT

通过AWRRPT查看sql语句的执行计划。
同其他方式一样,要想获得sql语句的执行计划,必须获得该sql的sql_id。有了sql_id,并且确认该sql已经被记录在dba_hist_sqltext里,你就可以使用oracle10g提供的dbms_xplan.display_awr包显示指定sql_id的执行计划。

比如,执行一条sql,通过awrrpt获取其执行计划的步骤如下:

1)执行sql语句

sql>select /*awrshow*/ id from test order by id;

2)确认sql语句的sql_id

sql>select sql_id,sql_text from v$sql where sql_text like '%awrshow%';

3)确认该sql是否被记录在dba_hist_sqltext里

sql>select sql_id,sql_text from dba_hist_sqltext where sql_id = '****';

注意:如果没有该sql的信息,则手工设置AWR的snapshot,将sql信息记录在dba_hist_sqltext里。执行如下sql命令:
sql>exec dbms_workload_repository.create_snapshot();

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

sql>select plan_table_output from table(dbms_xplan.display_awr('sql_id'));

结合AWRRPT功能查看sql语句的执行计划最大的用处就是,当业务出现瓶颈或是峰值时,你可以获得异常时间段内问题sql语句的执行计划与正常表现时的进行对比。当然前提是,数据库是Oracle10g及以上版本,并使用了AWRRPT功能。