1.创建执行计划表
脚本位于:%ORACLE_HOME%/product/11.1.0/db_1/RDBMS/ADMIN/utlxplan.sql
--PLAN_TABLE
create table 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 numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
depth numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30),
cpu_cost numeric,
io_cost numeric,
temp_space numeric,
access_predicates varchar2(4000),
filter_predicates varchar2(4000),
projection varchar2(4000),
time numeric,
qblock_name varchar2(30),
other_xml clob
);
也可以创建公共计划表
1.通过运行utlxplan.sql脚本,以自己选择的模式创建计划表。
2.创建计划表的公共同名对象。
3.将对计划表的访问授权为公共。
CREATE PUBLIC SYNONYM plan_table FOR plan_table;
GRANT SELECT,INSERT,UPDATE,DELETE ON plan_table TO PUBLIC;
2.计划表中常用列:
列 | 描述 |
statement_id | 赋给执行计划的名称 |
operation | 执行的数据库操作,可以是:
例如,访问表的操作是TABLE ACCESS |
options | 操作中选项的名称。例如,全表扫描的选项是FULL |
object_name | 操作中引用的数据库对象的名称 |
object_type | 对象的属性。例如,唯一索引的属性为UNIQUE |
id | 执行计划中赋给该操作的数字 |
parent_id | 执行计划中当前步骤的父数字。parent_id值与父步骤中的id值有关 |
position | 具有相同parent_id的步骤的处理顺序 |
cost | 操作的工作单元的估计值。基于成本的优化使用磁盘I/O、CPU使用率和内存利用率作为工作单元。所以,成本是磁盘I/O数目和执行操作所使用的CPU和内存数量的估计值 |
3.创建执行计划
EXPLAIN PLAN SET STATEMENT_ID = 'TEST_CONTENT' FOR
SELECT C.ID, C.TITLE, C.SUBHEAD, C.SUMMARY
FROM TEST_CONTENT C
WHERE EXISTS (SELECT 1 FROM TEST_SORT S WHERE S.ID = C.SORT_ID);
4.查看执行计划
SELECT ID || DECODE(ID, 0, '', LPAD(' ', 2 * (LEVEL - 1))) || ' ' ||
OPERATION || ' ' || OPTIONS || ' ' || OBJECT_NAME || ' ' || OBJECT_TYPE || ' ' ||
DECODE(COST, NULL, '', 'Cost = ' || POSITION) AS EXECUTION_PLAN
FROM PLAN_TABLE
CONNECT BY PRIOR ID = PARENT_ID
AND STATEMENT_ID = '&v_statement_id'
START WITH ID = 0
AND STATEMENT_ID = '&v_statement_id';
将第二条SQL语句保存在 :%ORACLE_HOME%/product/11.1.0/db_1/RDBMS/ADMIN/explain_plan.sql,下次直接使用。
5.包含表连接的执行计划
EXPLAIN PLAN SET STATEMENT_ID = 'TEST_CONTENT2' FOR
SELECT S.ID AS SID, S.NAME, C.TITLE, SUBHEAD, SUMMARY
FROM TEST_CONTENT C, TEST_SORT S
WHERE C.SORT_ID = S.ID
AND C.SORT_ID = 170
执行上面的查看执行计划语句查看执行计划。
6.执行计划包括
1)语句所引用的表的顺序
2)语句所涉及的表的访问方法
3)语句中连接操作所影响到的各表的连接方法。