2013-06-18 63 views
2

类似于this questionOracle相当于Postgres EXPLAIN ANALYZE

我想在Oracle(10g)中得到一个详细的查询计划和实际执行,类似于PostgreSQL中的EXPLAIN ANALYZE。有没有相同的东西?

+0

我认为这与查询sys.v $ sql_plan或sys.v $ sql_plan_statistics有关,但它将很好地得到实际的sql运行,以便正确地获取这些视图。 –

+1

我多年没有使用过Oracle,但是您是否已经检出了GATHER_PLAN_STATISTICS提示?请参阅第10-11页:http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-explain-the-explain-plan-052011-393674.pdf –

+0

请参阅此处了解如何获取实际值执行计划:https://forums.oracle.com/message/10153875#10153875以获得Postgres显示的相同数量的细节,您需要跟踪Oracle会话并查看tkprof生成的输出。 –

回答

2

最简单的方法是sql * plus中的autotrace。

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) 

或者,甲骨文确实有一个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 

甲骨文使用一个实用程序文件utlxpls.sql是有出货该查询的更完整版本。请检查$ORACLE_HOME/rdbms/admin

对于任何这些方法,您的DBA必须已经设置了适当的计划表。

+1

解释和autotrace不会显示运行语句时使用的实际计划(如Postgres所做的那样)。 –

+0

你如何得到使用的实际计划而不是预期的计划?这似乎相当于没有分析解释。我觉得第二种方法很接近,除了默认值之外,还有其他计划表可以查询吗? –

+0

有没有这样的事情作为预期的计划不同于oracle或postgresql中的实际计划。统计数据可能会有所不同,但计划是要运行的。你也可以使用autotrace显示统计信息 - 'set autotrace on statistics' - 但我没有使用过(我无法提供一个例子,因为DBA没有在我的db上启用该功能)。有关autotrace的更多信息,请参见[Oracle文档](http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch8.htm#sthref1499)。 –