【发布时间】:2017-04-22 10:48:15
【问题描述】:
我遇到了一些我无法解释的奇怪事情。
我正在使用以下查询:
MERGE INTO Main_Table t
USING Stg_Table s
ON(s.site_id = t.site_id)
WHEN MATCHED THEN
UPDATE SET t.arpu_prev_period = s.arpu_prev_period
.... --50 more columns
where t.period_code = 201612
Stg_Table : 索引 (Site_Id)
主表:
- 已编入索引 (Period_code,Site_id)
- 按 period_code 分区
- 注意 - 我尝试单独在 Site_Id 上添加索引,执行计划相同。
我希望有一个使用单分区扫描的执行计划,但我得到的是Partition list all。
这是执行计划:
6 | 0 | MERGE STATEMENT | |
7 | 1 | MERGE | Main_Table |
8 | 2 | VIEW | |
9 | 3 | HASH JOIN | |
10 | 4 | TABLE ACCESS FULL | Stg_Table |
11 | 5 | PARTITION LIST ALL| |
12 | 6 | TABLE ACCESS FULL| Main_Table |
编辑:为了澄清,如果不清楚,我不是在寻找有关如何使 Oracle 仅扫描单个分区的答案,我已经知道将 @987654325 ON 子句中的 @ 就可以了。我的问题是 - 为什么 oracle 不评估应该只过滤特定分区的 WHERE 子句?
【问题讨论】:
-
如果您将
t.period_code = 201612移动到ON条件而不是WHERE,您会得到相同的计划吗? -
Oracle 版本?
-
11g @DuduMarkovitz
-
还有
when not matched部分吗?
标签: sql oracle performance sql-execution-plan