在早期的Oracle数据库中如果需要使用执行计划的功能,需要提前准备环境,也就是需要先执行下面的的脚本:
SQL> @?/rdbms/admin/utlxplan.sql
在Oracle 10g版本,这一步骤可以被省略了,取而代之的是系统提供了一个全局的临时表PLAN_TABLE$供我们使用。从此,我们不再需要为使用“explain plan for”而单独去准备环境了。
1.看一下这个全局临时表的创建过程
DROP TABLE SYS.PLAN_TABLE$ CASCADE CONSTRAINTS;
CREATE GLOBAL TEMPORARY TABLE SYS.PLAN_TABLE$
(
STATEMENT_ID VARCHAR2(30 BYTE),
PLAN_ID NUMBER,
TIMESTAMP DATE,
REMARKS VARCHAR2(4000 BYTE),
OPERATION VARCHAR2(30 BYTE),
OPTIONS VARCHAR2(255 BYTE),
OBJECT_NODE VARCHAR2(128 BYTE),
OBJECT_OWNER VARCHAR2(30 BYTE),
OBJECT_NAME VARCHAR2(30 BYTE),
OBJECT_ALIAS VARCHAR2(65 BYTE),
OBJECT_INSTANCE INTEGER,
OBJECT_TYPE VARCHAR2(30 BYTE),
OPTIMIZER VARCHAR2(255 BYTE),
SEARCH_COLUMNS NUMBER,
ID INTEGER,
PARENT_ID INTEGER,
DEPTH INTEGER,
POSITION INTEGER,
COST INTEGER,
CARDINALITY INTEGER,
BYTES INTEGER,
OTHER_TAG VARCHAR2(255 BYTE),
PARTITION_START VARCHAR2(255 BYTE),
PARTITION_STOP VARCHAR2(255 BYTE),
PARTITION_ID INTEGER,
OTHER LONG,
OTHER_XML CLOB,
DISTRIBUTION VARCHAR2(30 BYTE),
CPU_COST INTEGER,
IO_COST INTEGER,
TEMP_SPACE INTEGER,
ACCESS_PREDICATES VARCHAR2(4000 BYTE),
FILTER_PREDICATES VARCHAR2(4000 BYTE),
PROJECTION VARCHAR2(4000 BYTE),
TIME INTEGER,
QBLOCK_NAME VARCHAR2(30 BYTE)
)
ON COMMIT PRESERVE ROWS
NOCACHE;
DROP PUBLIC SYNONYM PLAN_TABLE;
CREATE PUBLIC SYNONYM PLAN_TABLE FOR SYS.PLAN_TABLE$;
GRANT DELETE, INSERT, SELECT, UPDATE ON SYS.PLAN_TABLE$ TO PUBLIC;
2.创建脚本注释
1)首先在sys用户下创建了一个全局临时表PLAN_TABLE$
2)一句全局临时表PLAN_TABLE$创建了同名PLAN_TABLE
3)将同名PLAN_TABLE的增删改查权限授予PUBLIC,保证每个用户都可以使用。
3.PLAN_TABLE表的详细详细描述信息
关于PLAN_TABLE每个列的说明信息可以参考Oracle官方文档。
http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/ex_plan.htm#i18300
自行参考,不赘述。
4.小结
PLAN_TABLE$的出现,体现了Oracle的人性化和进步。正因为此处提供的是临时表,因此不同用户之间所查看的内容互不影响。
Good luck.
secooler
10.04.05
-- The End --