DBMS_XPLAN 有五个功能:
DISPLAY - to format and display the contents of a plan table.
DISPLAY_AWR - to format and display the contents of the execution plan of a stored SQL statement in the AWR.
DISPLAY_CURSOR - to format and display the contents of the execution plan of any loaded cursor.
DISPLAY_SQL_PLAN_BASELINE - to display one or more execution plans for the SQL statement identified by SQL handle(11G新特性 SPM sql plan management)
DISPLAY_SQLSET - to format and display the contents of the execution plan of statements stored in a SQL tuning set.
先看第一种
display 直接查看目标sql语句预估的执行计划
SQL> explain plan for select * from emp where empno > 7900;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 169057108
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 38 | 2 (0)| 00:0
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 2 (0)| 00:0
|* 2 | INDEX RANGE SCAN | PK_EMP | 1 | | 1 (0)| 00:0
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("EMPNO">7900)
14 rows selected
SQL> DISPLAY_CURSOR 显示sql的真实执行计划
默认不加参数的时候显示上一条执行的sql语句的执行计划,这里有个小插曲,如果在pl sql developer里执行或者sqlplus执行过 set serveroutput on则会出错.
[oracle@my2950 ~]$ sqlplus scott/tigerSQL*Plus: Release 11.2.0.4.0 Production on Thu Nov 20 14:23:05 2014Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options14:23:05 SCOTT@mydb1>select count(*) from emp;COUNT(*)----------14Elapsed: 00:00:00.0014:23:21 SCOTT@mydb1>select * from table(dbms_xplan.display_cursor);PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID 9babjv8yq8ru3, child number 0BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;NOTE: cannot fetch plan for SQL_ID: 9babjv8yq8ru3, CHILD_NUMBER: 0Please verify value of SQL_ID and CHILD_NUMBER;It could also be that the plan is no longer in cursor cache (check v$sql_plan)8 rows selected.Elapsed: 00:00:00.0614:23:41 SCOTT@mydb1>14:25:13 SCOTT@mydb1>set serveroutput off14:25:18 SCOTT@mydb1>14:25:19 SCOTT@mydb1>select count(*) from emp;COUNT(*)----------14Elapsed: 00:00:00.0114:25:21 SCOTT@mydb1>select * from table(dbms_xplan.display_cursor);PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID g59vz2u4cu404, child number 0-------------------------------------select count(*) from empPlan hash value: 2937609675-------------------------------------------------------------------| Id | Operation | Name | Rows | Cost (%CPU)| Time |-------------------------------------------------------------------| 0 | SELECT STATEMENT | | | 1 (100)| || 1 | SORT AGGREGATE | | 1 | | || 2 | INDEX FULL SCAN| PK_EMP | 14 | 1 (0)| 00:00:01 |-------------------------------------------------------------------14 rows selected.Elapsed: 00:00:00.3214:25:24 SCOTT@mydb1>也可以用来显示存储在 cursor cache 里的sql执行计划14:49:56 SCOTT@mydb1>select /*+ 11111111 */ count(*) from emp where empno>9000;COUNT(*)----------0Elapsed: 00:00:00.0014:50:16 SCOTT@mydb1>select sql_text,sql_id,child_number from v$sql where sql_text like '%111111%';SQL_TEXT SQL_ID CHILD_NUMBER---------------------------------------------------------------------------------------------------- ------------- ------------select /*+ 11111111 */ count(*) from emp where empno>9000 8m2c6qfyabqyj 0select sql_text,sql_id,child_number from v$sql where sql_text like '%111111%' 1ca5a8ha87r92 0Elapsed: 00:00:00.1014:50:26 SCOTT@mydb1>select * from table(dbms_xplan.display_cursor('8m2c6qfyabqyj',0));PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID 8m2c6qfyabqyj, child number 0-------------------------------------select /*+ 11111111 */ count(*) from emp where empno>9000Plan hash value: 109489892----------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------| 0 | SELECT STATEMENT | | | | 1 (100)| || 1 | SORT AGGREGATE | | 1 | 4 | | ||* 2 | INDEX RANGE SCAN| PK_EMP | 1 | 4 | 1 (0)| 00:00:01 |----------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - access("EMPNO">9000)19 rows selected.Elapsed: 00:00:00.0414:50:49 SCOTT@mydb1>如果cursor cache里没有的话会报错SCOTT@mydb1>select * from table(dbms_xplan.display_cursor('8m2c6qfyabqyj',0));PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID: 8m2c6qfyabqyj, child number: 0 cannot be foundElapsed: 00:00:00.05SCOTT@mydb1>这时候有可能会用到 display_awr
DISPLAY_AWR 查看awr中存储的sql语句的执行计划
不是所有的sql都会存储到awr报告里
SQL> select P.sql_id,P.plan_hash_value from dba_hist_sql_plan p where p.object_owner='SCOTT';SQL_ID PLAN_HASH_VALUE------------- ---------------0dfmuzjzug2r5 33355946430dfmuzjzug2r5 3335594643SQL>
SQL> select P.sql_id,P.plan_hash_value from dba_hist_sql_plan p where p.object_owner='ZABBIX2' and rownum<2;SQL_ID PLAN_HASH_VALUE------------- ---------------2gsfm3d8xkpyc 4280477550SQL>SQL> select * from table(dbms_xplan.display_awr('2gsfm3d8xkpyc'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------SQL_ID 2gsfm3d8xkpyc--------------------select h.hostid,h.host,h.name,t.httptestid,t.name,t.variables,t.headers,t.agent,t.authentication,t.http_user,t.http_password,t.http_proxy,t.retries,t.ssl_cert_file,t.ssl_key_file,t.ssl_key_password,t.verify_peer,t.verify_host from httptest t,hosts h where t.hostid=h.hostid andt.nextcheck<=1416412955 and mod(t.httptestid,1)=0 and t.status=0 andh.proxy_hostid is null and h.status=0 and (h.maintenance_status=0 orh.maintenance_type=0)Plan hash value: 4280477550--------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU--------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | | | 4 (100| 1 | NESTED LOOPS | | 1 | 342 | 4 (0| 2 | TABLE ACCESS BY INDEX ROWID| HTTPTEST | 1 | 245 | 3 (0| 3 | INDEX RANGE SCAN | HTTPTEST_3 | 2 | | 1 (0| 4 | TABLE ACCESS BY INDEX ROWID| HOSTS | 1 | 97 | 1 (0PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------| 5 | INDEX UNIQUE SCAN | SYS_C0027662 | 1 | | 0 (0--------------------------------------------------------------------------------23 rows selectedSQL>
basic 仅仅显示最少的信息。基本上包括操作和操作的对象
typical 显示大部分信息。基本上包括除了别名,提纲和字段投影外的所有信息,此为缺省值。
serial 类似于typical,但不显示并行操作
all 显示除提纲之外的所有信息
SCOTT@mydb1>select count(*) from emp;COUNT(*)----------14Elapsed: 00:00:00.00SCOTT@mydb1>select * from table(dbms_xplan.display_cursor);PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID g59vz2u4cu404, child number 0-------------------------------------select count(*) from empPlan hash value: 2937609675-------------------------------------------------------------------| Id | Operation | Name | Rows | Cost (%CPU)| Time |-------------------------------------------------------------------| 0 | SELECT STATEMENT | | | 1 (100)| || 1 | SORT AGGREGATE | | 1 | | || 2 | INDEX FULL SCAN| PK_EMP | 14 | 1 (0)| 00:00:01 |-------------------------------------------------------------------14 rows selected.Elapsed: 00:00:00.02SCOTT@mydb1>select * from table(dbms_xplan.display_cursor('g59vz2u4cu404',null,'basic'));PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------EXPLAINED SQL STATEMENT:------------------------select count(*) from empPlan hash value: 2937609675-----------------------------------| Id | Operation | Name |-----------------------------------| 0 | SELECT STATEMENT | || 1 | SORT AGGREGATE | || 2 | INDEX FULL SCAN| PK_EMP |-----------------------------------14 rows selected.Elapsed: 00:00:00.01SCOTT@mydb1>SCOTT@mydb1>select * from table(dbms_xplan.display_cursor('g59vz2u4cu404',null,'all'));PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID g59vz2u4cu404, child number 0-------------------------------------select count(*) from empPlan hash value: 2937609675-------------------------------------------------------------------| Id | Operation | Name | Rows | Cost (%CPU)| Time |-------------------------------------------------------------------| 0 | SELECT STATEMENT | | | 1 (100)| || 1 | SORT AGGREGATE | | 1 | | || 2 | INDEX FULL SCAN| PK_EMP | 14 | 1 (0)| 00:00:01 |-------------------------------------------------------------------Query Block Name / Object Alias (identified by operation id):-------------------------------------------------------------1 - SEL$12 - SEL$1 / EMP@SEL$1Column Projection Information (identified by operation id):-----------------------------------------------------------1 - (#keys=0) COUNT(*)[22]25 rows selected.Elapsed: 00:00:00.03SCOTT@mydb1>