类似于这个问题。
我想在 Oracle (10g) 中获得详细的查询计划和实际执行,类似于 PostgreSQL 中的 EXPLAIN ANALYZE。有没有等价物?
类似于这个问题。
我想在 Oracle (10g) 中获得详细的查询计划和实际执行,类似于 PostgreSQL 中的 EXPLAIN ANALYZE。有没有等价物?
最简单的方法是 sql*plus 中的自动跟踪。
SQL> set autotrace on exp
SQL> select count(*) from users ;
COUNT(*)
----------
137553
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=66 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'SYS_C0062362' (INDEX (UNIQUE)
) (Cost=66 Card=137553)
或者,oracle 确实有一个explain plan
语句,您可以执行然后查询各种计划表。最简单的方法是使用DBMS_XPLAN
包:
SQL> explain plan for select count(*) from users ;
Explained.
SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY);
--------------------------------------------------------------
| Id | Operation | Name | Rows | Cost |
--------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 66 |
| 1 | SORT AGGREGATE | | 1 | |
| 2 | INDEX FAST FULL SCAN| SYS_C0062362 | 137K| 66 |
--------------------------------------------------------------
如果你是老派,你可以自己查询计划表:
SQL> explain plan set statement_id = 'my_statement' for select count(*) from users;
Explained.
SQL> column "query plan" format a50
SQL> column object_name format a25
SQL> select lpad(' ',2*(level-1))||operation||' '||options "query plan", object_name
from plan_table
start with id=0 and statement_id = '&statement_id'
connect by prior id=parent_id
and prior statement_id=statement_id
Enter value for statement_id: my_statement
old 3: start with id=0 and statement_id = '&statement_id'
new 3: start with id=0 and statement_id = 'my_statement'
SELECT STATEMENT
SORT AGGREGATE
INDEX FAST FULL SCAN SYS_C0062362
Oracle 曾经附带一个实用程序文件utlxpls.sql
,该文件具有该查询的更完整版本。检查下$ORACLE_HOME/rdbms/admin
。
对于这些方法中的任何一种,您的 DBA 必须已经设置了适当的计划表。