cas*_*son 5 sql oracle sql-execution-plan
类似于这个问题。
我想在 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)
Run Code Online (Sandbox Code Playgroud)
或者,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 |
--------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
如果你是老派,你可以自己查询计划表:
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
Run Code Online (Sandbox Code Playgroud)
Oracle 过去常常附带一个实用程序文件,utlxpls.sql其中包含该查询的更完整版本。检查下$ORACLE_HOME/rdbms/admin。
对于任何这些方法,您的 DBA 必须已经设置了适当的计划表。
| 归档时间: |
|
| 查看次数: |
4734 次 |
| 最近记录: |