我遇到了无法解释的怪异现象。
我正在使用以下查询:
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仅扫描单个分区的答案,我已经知道将
t.period_code = 201612
放在ON
子句中会很好。我的问题是-为什么oracle不评估应该只过滤特定分区的WHERE
子句? 最佳答案
似乎对UPDATE的WHERE子句根本没有优化。
create table t (n,x) as select level n,-1 x from dual connect by level <= 1000000;
create table s (n,x) as select level n,-1 x from dual connect by level <= 1000000;
merge into t
using s
on (s.n = t.n)
when matched then update set t.x = s.x where 1=2
;
关于sql - 执行计划与预期不符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41018370/