我遇到了一些我不能解释的奇怪现象。执行计划与预期不符
我使用下面的查询:
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)
MAIN_TABLE:
- 索引(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 |
编辑:对于澄清,如果它是不明确的,我不是在寻找如何使甲骨文的答案,只扫描单个分区,我已经知道把t.period_code = 201612
放在ON
条款中会没问题。我的问题是 - 为什么oracle不会评估应该只过滤特定分区的WHERE
子句?
如果您将't.period_code = 201612'移动到'ON'状态而不是'WHERE',您是否得到相同的计划? – Kacper
Oracle版本? –
11g @DuduMarkovitz – sagi