Oracle 相当于 Postgres EXPLAIN ANALYZE

cas*_*son 5 sql oracle sql-execution-plan

类似于这个问题

我想在 Oracle (10g) 中获得类似于 PostgreSQL 中的 EXPLAIN ANALYZE 的详细查询计划和实际执行。有等价物吗?

evi*_*tto 3

最简单的方法是 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 必须已经设置了适当的计划表。

  • explain 和 autotrace 不会显示运行语句时使用的实际计划(如 Postgres 那样)。 (3认同)