我一直認爲執行計劃中的節點只能在其子節點執行後執行,因此節點的總成本必須大於或等於子節點的成本。然而,這並非總是如此,就像下面的例子:執行計劃中的節點如何比其子節點成本更低?
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之間的成本差異的正確方法?
除非我失去了一些東西,不應該這個問題的標題是「如何才能節點在執行計劃中,其成本是否比其父母大?「 – 2009-08-07 15:10:30
@尼爾:當然你是對的。我把父母變成了孩子,所以現在應該是有道理的。 – 2009-08-07 16:04:54
這是預期的行爲。這是EXPLAIN PLAN的限制,這不是問題。如果您需要查看有關語句實際性能以及優化程序如何選擇計劃的詳細信息,請跟蹤事件10046和10053. – spencer7593 2009-08-07 19:51:25