新博客http://www.cnblogs.com/zhjh256 欢迎访问
分类: Oracle
2008-01-06 21:52:46
EXPLAIN PLAN是一个Oracle SQL命令用来解析相关的SQL,然后存储从优化器计算而来的执行计划到恰当的表。
SQL> explain plan for
2 select * from test_card where year=2005;
Explained
当然对于执行相同的查询,优化器不一定需要返回相同的执行计划。主要原因包括:
·EXPLAIN PLAN不会使用绑定变量,而绑定变量会影响优化器选择的执行计划;
·收集了统计,但是已存在的计划不会变无效;
·执行EXPLAIN PLAN的会话的环境不一定相同;
·绑定变量数据类型的变化;
在9i+下,最好使用DBMS_XPLAN查询PLAN_TABLE:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
该输出会显示比utlxpls.sql更加详细的信息,其中包括了CPU是否考虑在内等。
如果声明了statement_id,则使用:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','id','ALL'));
在9i+下包含了以下列:
CPU_COST NUMBER(38)
IO_COST NUMBER(38)
TEMP_SPACE NUMBER(38)
ACCESS_PREDICATES VARCHAR2(4000)
FILTER_PREDICATES VARCHAR2(4000)
10GR2还包含了如下:
PROJECTION VARCHAR2(4000)
TIME NUMBER(38,10)
QBLOCK_NAME VARCHAR2(30)
关于SYS.PLAN_TABLE$和V$SQL_PLAN
PLAN_TABLE$是一个全局临时表,可以使用PLAN_TABLE为其创建一个同义词避免每个用户都需要这样一个计划表。并且这作为了10gRx标准的一部分存在。