私は説明できない奇妙なことに遭遇しました。実行計画が期待どおりでない
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 |
EDIT:それは明確ではなかった場合、私は単一パーティションのみをスキャンするには、Oracleを作成する方法についての答えを明確にするため見ていませんよ、私はすでにt.period_code = 201612
をON
句に入れることはうまくいくことを知っています。私の質問は - oracleが特定のパーティションだけをフィルタリングするWHERE
句を評価しないのはなぜですか?
't.period_code = 201612'を' WHERE'ではなく 'ON'条件にすると同じ計画が得られますか? – Kacper
Oracle版ですか? –
11g @DuduMarkovitz – sagi