最近一直在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_id是plan_table表的字段名,标记该条sql的id信息
“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'; 未选定行 |
如果没有记录,手工设置AWR的snapshot,将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
注意:红色部分是可选项,默认是显示explain和statistics
执行”set autotrace option”后,运行的sql在返回结果结束后根据设置显示该条sql的执行计划或统计信息