2013-06-18 87 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)。 –