创建自己的Oracle解释计划
1、解释计划
当使用explain plan来为一个查询生成预期的执行计划时,输出将包括一下几种:
SQL访问的每一张表;
访问每张表的方法;
每一个需要联结的数据源所使用的联结方法;
按次序列出的所有需要完成的运算;
计划中各步骤的谓语列表信息等等
explain plan for
select t1.name, t2.grade
from table1 t1
left join table2 t2
on t1.id = t2.id
where t1.id =704
;
Explained
查询得:(与谓语有关的运算都会有*号标注)
select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2814340807
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 141 | 8
|* 1 | HASH JOIN OUTER | | 1 | 141 | 8
| 2 | TABLE ACCESS BY INDEX ROWID| TABLE1 | 1 | 115 | 2
|* 3 | INDEX RANGE SCAN | INDEX_TABLE1_ID | 1 | | 1
|* 4 | TABLE ACCESS FULL | TABLE2 | 1 | 26 | 5
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."ID"="T2"."ID"(+))
3 - access("T1"."ID"=704)
4 - filter("T2"."ID"(+)=704)
Note
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
- dynamic sampling used for this statement (level=2)
22 rows selected
2、系统解释计划表的内容
desc plan_table
Name Type Nullable Default Comments
----------------- -------------- -------- ------- --------
STATEMENT_ID VARCHAR2(30) Y
PLAN_ID NUMBER Y
TIMESTAMP DATE Y
REMARKS VARCHAR2(4000) Y
OPERATION VARCHAR2(30) Y
OPTIONS VARCHAR2(255) Y
OBJECT_NODE VARCHAR2(128) Y
OBJECT_OWNER VARCHAR2(30) Y
OBJECT_NAME VARCHAR2(30) Y
OBJECT_ALIAS VARCHAR2(65) Y
OBJECT_INSTANCE INTEGER Y
OBJECT_TYPE VARCHAR2(30) Y
OPTIMIZER VARCHAR2(255) Y
SEARCH_COLUMNS NUMBER Y
ID INTEGER Y
PARENT_ID INTEGER Y
DEPTH INTEGER Y
POSITION INTEGER Y
COST INTEGER Y
CARDINALITY INTEGER Y
BYTES INTEGER Y
OTHER_TAG VARCHAR2(255) Y
PARTITION_START VARCHAR2(255) Y
PARTITION_STOP VARCHAR2(255) Y
PARTITION_ID INTEGER Y
OTHER LONG Y
OTHER_XML CLOB Y
DISTRIBUTION VARCHAR2(30) Y
CPU_COST INTEGER Y
IO_COST INTEGER Y
TEMP_SPACE INTEGER Y
ACCESS_PREDICATES VARCHAR2(4000) Y
FILTER_PREDICATES VARCHAR2(4000) Y
PROJECTION VARCHAR2(4000) Y
TIME INTEGER Y
QBLOCK_NAME VARCHAR2(30) Y
其中常用字段说明
创建自己的解释计划
select
id,parent_id,
lpad(
' '
,
level
)||operation||
' '
||options||
' '
||object_name
as
operation
from
plan_table
start
with
id=0
connect
by
prior
id = parent_id;
结果为
ID PARENT_ID OPERATION
--------------------------------------- --------------------------------------- -----------------------------------------
0
select
STATEMENT
1 0 HASH
JOIN
OUTER
2 1
TABLE
ACCESS
by
INDEX
ROWID TABLE1
3 2
INDEX
RANGE SCAN INDEX_TABLE1_ID
4 1
TABLE
ACCESS
FULL
TABLE2
通过查看解释计划,可以针对性的修改自己的SQL语句来提升效率。比如修改或者增加索引等等
查看执行计划与此相似,可以通过dbms.display_cursor函数来查看,也可以通过查询V$SQL_PLAN_STATISTICS_ALL中的相关字段来查看。