PLAN statement to determine the execution plan Oracle Database follows to execute a specified SQL statement. This statement inserts a row describing each step of the execution plan into a specified table. You can also issue the
PLAN statement as part of the SQL trace facility.
This statement also determines the cost of executing the statement. If any domain indexes are defined on the table, then user-defined CPU and I/O costs will also be inserted.
The definition of a sample output table
PLAN_TABLE is available in a SQL script on your distribution media. Your output table must have the same column names and data types as this table. The common name of this script is
UTLXPLAN.SQL. The exact name and location depend on your operating system.
For information on the work areas used by SQL cursors, query
For information on the execution plan for a cached cursor, query
For execution statistics at each step or operation of an execution plan of cached cursors (for example, number of produced rows, number of blocks read), query
For a selective precomputed join of the preceding three views, query
Execution statistics at each step or operation of an execution plan of cached cursors are displayed in
V$SQL_PLAN_MONITORif the statement execution is monitored. You can force monitoring using the
To issue an
PLAN statement, you must have the privileges necessary to insert rows into an existing output table that you specify to hold the execution plan.
You must also have the privileges necessary to execute the SQL statement for which you are determining the execution plan. If the SQL statement accesses a view, then you must have privileges to access any tables and views on which the view is based. If the view is based on another view that is based on a table, then you must have privileges to access both the other view and its underlying table.
To examine the execution plan produced by an
PLAN statement, you must have the privileges necessary to query the output table.
PLAN statement is a data manipulation language (DML) statement, rather than a data definition language (DDL) statement. Therefore, Oracle Database does not implicitly commit the changes made by an
PLAN statement. If you want to keep the rows generated by an
PLAN statement in the output table, then you must commit the transaction containing the statement.
SET STATEMENT_ID Clause
Specify a value for the
STATEMENT_ID column for the rows of the execution plan in the output table. You can then use this value to identify these rows among others in the output table. Be sure to specify a
STATEMENT_ID value if your output table contains rows from many execution plans. If you omit this clause, then the
STATEMENT_ID value defaults to null.
INTO table Clause
If you omit
schema, then the database assumes the table is in your own schema.
dblink can be a complete or partial name of a database link to a remote Oracle Database where the output table is located. You can specify a remote output table only if you are using Oracle Database distributed functionality. If you omit
dblink, then the database assumes the table is on your local database. See "References to Objects in Remote Databases" for information on referring to database links.
If you omit
INTO altogether, then the database assumes an output table named
PLAN_TABLE in your own schema on your local database.
FOR statement Clause
Notes on EXPLAIN PLAN
The following notes apply to
parallel_clause, then the resulting execution plan will indicate parallel execution. However,
PLANactually inserts the statement into the plan table, so that the parallel DML statement you submit is no longer the first DML statement in the transaction. This violates the Oracle Database restriction of one parallel DML statement in a single transaction, and the statement will be executed serially. To maintain parallel execution of the statements, you must commit or roll back the
PLANstatement, and then submit the parallel DML statement.
To determine the execution plan for an operation on a temporary table,
PLANmust be run from the same session, because the data in temporary tables is session specific.
EXPLAIN PLAN Examples
The following statement determines the execution plan and cost for an
UPDATE statement and inserts rows describing the execution plan into the specified
plan_table table with the
STATEMENT_ID value of 'Raise in Tokyo':
EXPLAIN PLAN SET STATEMENT_ID = 'Raise in Tokyo' INTO plan_table FOR UPDATE employees SET salary = salary * 1.10 WHERE department_id = (SELECT department_id FROM departments WHERE location_id = 1700);
SELECT statement queries the
plan_table table and returns the execution plan and the cost:
SELECT id, LPAD(' ',2*(LEVEL-1))||operation operation, options, object_name, object_alias, position FROM plan_table START WITH id = 0 AND statement_id = 'Raise in Tokyo' CONNECT BY PRIOR id = parent_id AND statement_id = 'Raise in Tokyo' ORDER BY id;
The query returns this execution plan:
ID OPERATION OPTIONS OBJECT_NAME OBJECT_ALIAS POSITION --- -------------------- -------------------- -------------------- -------------------- -------- 0 UPDATE STATEMENT 4 1 UPDATE EMPLOYEES 1 2 INDEX RANGE SCAN EMP_DEPARTMENT_IX EMPLOYEES@UPD$1 1 3 TABLE ACCESS BY INDEX ROWID DEPARTMENTS DEPARTMENTS@SEL$1 1 4 INDEX RANGE SCAN DEPT_LOCATION_IX DEPARTMENTS@SEL$1 1
The value in the
POSITION column of the first row shows that the statement has a cost of 4.
EXPLAIN PLAN: Partitioned Example
The sample table
sh.sales is partitioned on the
time_id column. Partition
sales_q3_2000 contains time values less than Oct. 1, 2000, and there is a local index
sales_time_bix on the
Consider the query:
EXPLAIN PLAN FOR SELECT * FROM sales WHERE time_id BETWEEN :h AND '01-OCT-2000';
:h represents an already declared bind variable.
PLAN executes this query with
PLAN_TABLE as the output table. The basic execution plan, including partitioning information, is obtained with the following query:
SELECT operation, options, partition_start, partition_stop, partition_id FROM plan_table;