2.2 如何查看执行计划 (1)、explain plan命令 按F5,PL/SQL Developer就调用explain plan命令,F5只是explain plan命令上的一层封装而已。 语法: explain plan for + 目标SQL select * from table(dbms_xplan.display) 执行explain plan命令,则Oracle就将解析目标SQL所产生的执行计划的具体执行步骤写入PLAN_TABLE$,随后执行的select * from table(dbms_xplan.display)只是从PLAN_TABLE$中将这些具体执行步骤以格式化的方式显示出来。PLAN_TABLE$是一个ON COMMIT PRESERVE ROWS的GLOBAL TEMPORARY TABLE,所以这里Oracle可以做到各个session只能看到自己执行的SQL所产生的执行计划,并且各个session往PLAN_TABLE$写入执行计划的过程互不干扰。 SQL> select dbms_metadata.get_ddl('TABLE', 'PLAN_TABLE$', 'SYS') from dual; CREATE GLOBAL TEMPORARY TABLE "SYS"."PLAN_TABLE$" ( "STATEMENT_ID" VARCHAR2(30), "PLAN_ID" NUMBER, "TIMESTAMP" DATE, "REMARKS" VARCHAR2(4000), "OPERATION" VARCHAR2(30), "OPTIONS" VARCHAR2(255), "OBJECT_NODE" VARCHAR2(128), "OBJECT_OWNER" VARCHAR2(30), "OBJECT_NAME" VARCHAR2(30), "OBJECT_ALIAS" VARCHAR2(65), "OBJECT_INSTANCE" NUMBER(*,0),
"OBJECT_TYPE" VARCHAR2(30), "OPTIMIZER" VARCHAR2(255), "SEARCH_COLUMNS" NUMBER, "ID" NUMBER(*,0), "PARENT_ID" NUMBER(*,0), "DEPTH" NUMBER(*,0), "POSITION" NUMBER(*,0), "COST" NUMBER(*,0), "CARDINALITY" NUMBER(*,0), "BYTES" NUMBER(*,0), "OTHER_TAG" VARCHAR2(255), "PARTITION_START" VARCHAR2(255), "PARTITION_STOP" VARCHAR2(255),
"PARTITION_ID" NUMBER(*,0), "OTHER" LONG, "OTHER_XML" CLOB, "DISTRIBUTION" VARCHAR2(30), "CPU_COST" NUMBER(*,0), "IO_COST" NUMBER(*,0), "TEMP_SPACE" NUMBER(*,0), "ACCESS_PREDICATES" VARCHAR2(4000), "FILTER_PREDICATES" VARCHAR2(4000), "PROJECTION" VARCHAR2(4000), "TIME" NUMBER(*,0), "QBLOCK_NAME" VARCHAR2(30) ) ON COMMIT PRESERVE ROWS
Oracle 10g及其以上版本,explain plan命令在执行后确实将解析目标SQL所产生的执行计划的具体步骤写入了PLAN_TABLE$,随后执行的select * from table(dbms_xplan.display)只是从PLAN_TABLE$中将具体执行步骤以格式化的方式显示出来。 SQL> select count(*) from sys.plan_table$; COUNT(*)
----------
0
SQL> select sid from v$mystat where rownum < 2;
SID
----------
1178
SQL> select count(*) from v$mystat;
COUNT(*)
----------
604
SQL> select saddr from v$session where sid=1178;
SADDR
----------------
00000001EEC37778
SQL> select count(*) from v$transaction where ses_addr='00000001EEC37778';
----------
0
SQL> select count(*) from v$locked_object;
COUNT(*)
----------
0
SQL> explain plan for select empno, ename, dname from scott.emp, scott.dept where emp.deptno=dept.deptno;
Explained.
SQL> set long 90000
SQL> set heading off
SQL> set serveroutput on size 1000000
SQL> select operation, options, object_name, id, cardinality, cost from sys.plan_table$;
OPERATION
------------------------------
OPTIONS
--------------------------------------------------------------------------------
OBJECT_NAME ID CARDINALITY COST
------------------------------ ---------- ----------- ----------
SELECT STATEMENT
0 14 6
MERGE JO