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)语句中连接操作所影响到的各表的连接方法。