Oracle 执行计划中的节点如何比其子节点具有更小的成本?
我一直认为,执行计划中的节点只能在其子节点执行后执行,因此,节点的总成本必须大于或等于子节点的成本。但是,情况并非总是如此,如以下示例所示:Oracle 执行计划中的节点如何比其子节点具有更小的成本?,oracle,sql-execution-plan,cost-based-optimizer,Oracle,Sql Execution Plan,Cost Based Optimizer,我一直认为,执行计划中的节点只能在其子节点执行后执行,因此,节点的总成本必须大于或等于子节点的成本。但是,情况并非总是如此,如以下示例所示: Plan hash value: 2810258729 ------------------------------------------------------------------------------------------------- ------------------------ | Id | Operation
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")
计划哈希值:2810258729
------------------------------------------------------------------------------------------------- ------------------------
|Id |操作|名称|行|字节|成本(%CPU)|时间|
------------------------------------------------------------------------------------------------- ------------------------
|0 | SELECT语句| 10 | 1170 | 3871(1)| 00:00:47|
|*1 |计数停止键| | | | ||
|2 |视图| 10 | 1170 | 3871 | 00:00:47|
|3 |视图| V|u TOP | u体裁| 10 | 1170 | 3871(1)| 00:00:47|
|4 |窗口排序| | 10 | 890 | 3871(1)| 00:00:47|
|5 |合并联接| 10 | 890 | 3871(1)| 00:00:47|
|6 |视图| 345 | 10350 | 3867(1)00:00:47|
|7 |按| | 345 | 16560 | 133K(1)| 00:26:41对分组进行排序|
|*8 |散列连接| 9627 | 451K | 133K(1)| 00:26:41|
|9 |视图| 9627 | 366K | 133K(1)00:26:41|
|10 |排序唯一| 9627 | 611K | 133K(51)| 00:26:41|
|11 |联合所有| | | | ||
|*12 | HASH JOIN | 6639 | 421K | 66681(1)00:13:21|
|13 |索引快速全扫描| T|u创意| u精选| u ADV|u CREA | 28973 | 169K | 9(0)| 00:00:01|
|14 |嵌套循环| | 22243 | 1281K | 66671(1)| 00:13:21|
|15 |按索引ROWID访问表|报告|过滤器|时间范围| 1 | 24 | 1(0)| 00:00:01|
|*16 |索引唯一扫描|系统C0053942 | 1 | 1(0)| 00:00:01|
|*17 |表访问完整|插入|电视|收音机| 22243 | 760K | 66670(1)| 00:13:21|
|*18 | HASH JOIN | 2988 | 189K | 66697(1)00:13:21|
|19 |索引快速全扫描| T|u创意| u精选| u ADV|u CREA | 28973 | 169K | 9(0)| 00:00:01|
|20 |嵌套循环| | 10010 | 576K | 66688(1)| 00:13:21|
|21 |按索引ROWID访问表|报告|过滤器|时间范围| 1 | 24 | 1(0)| 00:00:01|
|*22 |索引唯一扫描|系统C0053942 | 1 | 1(0)| 00:00:01|
|*23 |表格访问完整|插入|电视|收音机| 10010 | 342K | 66687(1)| 00:13:21|
|24 |表格访问完整|分配|广播|体裁| 25135 | 220K | 20(0)| 00:00:01|
|*25 |排序联接| 345 | 10005 | 4(25)| 00:00:01|
|26 |表格访问完整|体裁| 345 | 10005 | 3(0)| 00:00:01|
------------------------------------------------------------------------------------------------- ------------------------
谓词信息(由操作id标识):
---------------------------------------------------
1-过滤器(ROWNUM=“B”“开始日期”和
“A”“INS_DATE”=“B”“START_DATE”和“A”“INS_DATE”可以尝试其他工具(TOAD/SQL*Plus/etc)查看结果是否相同(即确定是客户端显示还是服务器问题)
您的所有表都进行了分析吗?您没有提供SQL,但在整个查询中可能有标量子查询-在这种情况下,EXPLAIN PLAN输出单次执行子查询的成本,但不知道它将执行多少次
[编辑]
我想如果我看一下,我会发现乔纳森·刘易斯(Jonathan Lewis)的参考文献可以更好地解释这一点——请参见,除非我遗漏了什么,否则这个问题的标题不应该是“执行计划中的节点怎么可能比其父节点的成本更高?”@Neil:当然,你是对的。我将父项更改为子项,所以现在应该有意义了。这是预期的行为。这是解释计划的限制,不是问题。如果你需要查看有关语句的实际性能以及优化器如何选择计划的详细信息,请跟踪事件10046和10053。我尝试了SQL*Plus,SQL Developer和Aqua Data Studio,所有这些都显示相同的结果。这些表都经过分析。如果我理解你(以及你链接的帖子)正确地说,优化器假设执行计划的一个分支将执行0次,因此忽略了该分支的成本。这不是一个非常危险的假设吗?我认为这更像是解释计划不能准确地表示优化器在决策过程中使用的内容的情况-10053跟踪是查看该分支的最佳方式这方面的细节。