2009-08-07 25 views
1

我一直認爲執行計劃中的節點只能在其子節點執行後執行,因此節點的總成本必須大於或等於子節點的成本。然而,這並非總是如此,就像下面的例子:執行計劃中的節點如何比其子節點成本更低?

Plan hash value: 2810258729 

------------------------------------------------------------------------------------------------- ------------------------ 
| Id | Operation        | Name       | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------------------------- ------------------------ 
| 0 | SELECT STATEMENT       |        | 10 | 1170 | 3871 (1)| 00:00:47 | 
|* 1 | COUNT STOPKEY       |        |  |  |   |   | 
| 2 | VIEW         |        | 10 | 1170 | 3871 (1)| 00:00:47 | 
| 3 | VIEW         | V_TOP_GENRE     | 10 | 1170 | 3871 (1)| 00:00:47 | 
| 4 |  WINDOW SORT       |        | 10 | 890 | 3871 (1)| 00:00:47 | 
| 5 |  MERGE JOIN       |        | 10 | 890 | 3871 (1)| 00:00:47 | 
| 6 |  VIEW        |        | 345 | 10350 | 3867 (1)| 00:00:47 | 
| 7 |  SORT GROUP BY      |        | 345 | 16560 | 133K (1)| 00:26:41 | 
|* 8 |   HASH JOIN      |        | 9627 | 451K| 133K (1)| 00:26:41 | 
| 9 |   VIEW       |        | 9627 | 366K| 133K (1)| 00:26:41 | 
| 10 |   SORT UNIQUE     |        | 9627 | 611K| 133K (51)| 00:26:41 | 
| 11 |   UNION-ALL      |        |  |  |   |   | 
|* 12 |    HASH JOIN     |        | 6639 | 421K| 66681 (1)| 00:13:21 | 
| 13 |    INDEX FAST FULL SCAN  | T_CREATIVE_SELECTED_ADV_CREA | 28973 | 169K|  9 (0)| 00:00:01 | 
| 14 |    NESTED LOOPS    |        | 22243 | 1281K| 66671 (1)| 00:13:21 | 
| 15 |    TABLE ACCESS BY INDEX ROWID| REPORT_FILTER_TIMERANGE  |  1 | 24 |  1 (0)| 00:00:01 | 
|* 16 |    INDEX UNIQUE SCAN   | SYS_C0053942     |  1 |  |  1 (0)| 00:00:01 | 
|* 17 |    TABLE ACCESS FULL   | INSERTION_TV_RADIO   | 22243 | 760K| 66670 (1)| 00:13:21 | 
|* 18 |    HASH JOIN     |        | 2988 | 189K| 66697 (1)| 00:13:21 | 
| 19 |    INDEX FAST FULL SCAN  | T_CREATIVE_SELECTED_ADV_CREA | 28973 | 169K|  9 (0)| 00:00:01 | 
| 20 |    NESTED LOOPS    |        | 10010 | 576K| 66688 (1)| 00:13:21 | 
| 21 |    TABLE ACCESS BY INDEX ROWID| REPORT_FILTER_TIMERANGE  |  1 | 24 |  1 (0)| 00:00:01 | 
|* 22 |    INDEX UNIQUE SCAN   | SYS_C0053942     |  1 |  |  1 (0)| 00:00:01 | 
|* 23 |    TABLE ACCESS FULL   | INSERTION_TV_RADIO   | 10010 | 342K| 66687 (1)| 00:13:21 | 
| 24 |   TABLE ACCESS FULL    | ASSIGNMENT_BROADCAST_GENRE | 25135 | 220K| 20 (0)| 00:00:01 | 
|* 25 |  SORT JOIN       |        | 345 | 10005 |  4 (25)| 00:00:01 | 
| 26 |  TABLE ACCESS FULL     | GENRE      | 345 | 10005 |  3 (0)| 00:00:01 | 
------------------------------------------------------------------------------------------------- ------------------------ 


Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - filter(ROWNUM<=10) 
    8 - access("A"."BROADCAST_ID"="C"."BROADCAST_ID") 
    12 - access("AD"."CREATIVE_ID"="A"."CREATIVE_ID") 
    16 - access("B"."RANGE_NAME"='current') 
    17 - filter("A"."BROADCAST_BEFORE_ID"<>(-1) AND "A"."INS_DATE">="B"."START_DATE" AND 
       "A"."INS_DATE"<="B"."END_DATE") 
    18 - access("AD"."CREATIVE_ID"="A"."CREATIVE_ID") 
    22 - access("B"."RANGE_NAME"='current') 
    23 - filter("A"."BROADCAST_AFTER_ID"<>(-1) AND "A"."BROADCAST_BEFORE_ID"<>(-1) AND 
       "A"."BROADCAST_BEFORE_ID"<>"A"."BROADCAST_AFTER_ID" AND "A"."INS_DATE">="B"."START_ DATE" AND "A"."INS_DATE"<="B"."END_DATE") 
    25 - access("TA"."GENRE_ID"="G"."GENRE_ID") 
     filter("TA"."GENRE_ID"="G"."GENRE_ID") 

什麼是閱讀線6和7之間的成本差異的正確方法?

+2

除非我失去了一些東西,不應該這個問題的標題是「如何才能節點在執行計劃中,其成本是否比其父母大?「 – 2009-08-07 15:10:30

+0

@尼爾:當然你是對的。我把父母變成了孩子,所以現在應該是有道理的。 – 2009-08-07 16:04:54

+0

這是預期的行爲。這是EXPLAIN PLAN的限制,這不是問題。如果您需要查看有關語句實際性能以及優化程序如何選擇計劃的詳細信息,請跟蹤事件10046和10053. – spencer7593 2009-08-07 19:51:25

回答

3

您沒有提供SQL,但是您可能在整個查詢中包含標量子查詢 - EXPLAIN PLAN輸出在這種情況下單次執行子查詢的成本,但不知道它將執行多少次。

[編輯] 我想如果我看着我會找到喬納森·劉易斯參考,解釋這更好的 - 看到http://jonathanlewis.wordpress.com/2007/10/12/scalar-subqueries/

+0

如果我正確理解了您(和您鏈接的帖子),優化器會假定執行計劃的一個分支將被執行0次,從而忽略該分支的成本。這不是一個相當危險的假設嗎? – 2009-08-07 15:31:01

+1

我認爲這更多是EXPLAIN PLAN的一個例子,它不能準確地表示優化程序用於決策過程的內容--10053跟蹤是查看詳細信息的最佳方法。 – dpbradley 2009-08-07 16:45:22

-1

也許嘗試另一種工具(TOAD/SQL * Plus/etc)來查看結果是否相同(即確定它是客戶端顯示還是服務器問題)?

你們所有的桌子都分析過了嗎?

+0

我試過SQL * Plus,SQL Developer和Aqua Data Studio,所有這些都顯示相同的結果。分析表格。 – 2009-08-07 15:22:32

相關問題