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的执行计划或统计信息。
不同选项说明如下:
|
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功能。