这篇文章将演示如何创建和展示解释计划。但是在继续创建和显示explain之前,架构必须有PLAN_TABLE。

很多时候开发人员会遇到找不到计划表的错误“ORA-02404: specified plan table not found”。 这是什么意思? 这意味着架构没有PLAN_TABLE。 最好和最简单的方法是运行以下脚本来创建 PLAN_TABLE:

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production With the Partitioning and Automatic Storage Management options

SQL> @?/rdbms/admin/utlxplan.sql

Table created.

SQL> DESC PLAN_TABLE; Name Null? Type


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(38) OBJECT_TYPE VARCHAR2(30) OPTIMIZER VARCHAR2(255) SEARCH_COLUMNS NUMBER ID NUMBER(38) PARENT_ID NUMBER(38) DEPTH NUMBER(38) POSITION NUMBER(38) COST NUMBER(38) CARDINALITY NUMBER(38) BYTES NUMBER(38) OTHER_TAG VARCHAR2(255) PARTITION_START VARCHAR2(255) PARTITION_STOP VARCHAR2(255) PARTITION_ID NUMBER(38) OTHER LONG OTHER_XML CLOB DISTRIBUTION VARCHAR2(30) CPU_COST NUMBER(38) IO_COST NUMBER(38) TEMP_SPACE NUMBER(38) ACCESS_PREDICATES VARCHAR2(4000) FILTER_PREDICATES VARCHAR2(4000) PROJECTION VARCHAR2(4000) TIME NUMBER(38) QBLOCK_NAME VARCHAR2(30) 为查询生成解释计划的语法:

SQL> EXPLAIN PLAN FOR select * from emp where deptno = 10;

Explained. 还可以为生成的解释计划分配一个 statement_id :

SQL> EXPLAIN PLAN SET STATEMENT_ID = 'test' FOR select * from emp where deptno=10;

Explained. 在此阶段,PLAN_TABLE 将填充所需的数据。 但是,为了理解它,我们需要以可读的格式显示它。 如果您只是尝试查看 PLAN_TABLE,您将无法轻松解释解释计划。 执行以下查询:

SELECT * FROM PLAN_TABLE WHERE STATEMENT_ID = 'test'; 看着很乱,很难解释,对吧?您希望它被正确地格式化为可读的。DBMS_XPLAN可以为您完成。

SQL> set linesize 200; SQL> SELECT * FROM TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT


Plan hash value: 3956160932


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |


| 0 | SELECT STATEMENT | | 5 | 190 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| EMP | 5 | 190 | 3 (0)| 00:00:01 |


Predicate Information (identified by operation id):


1 - filter("DEPTNO"=10)

13 rows selected.