我遇到了无法解释的怪异现象。

我正在使用以下查询:

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 - 执行计划与预期不符-LMLPHP

关于sql - 执行计划与预期不符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41018370/

10-13 08:35