バックグラウンド
最近、私の会社は Oracle 11g から Exadata にアップグレードしました。すべての本番オブジェクトとデータが新しいシステムに正常に移行され、システム間で 1 対 1 の一致が確認されました。新しいシステムで ETL プロセスの最初の日次セットが完了した直後に、レポート テーブルが予想よりも大幅に小さいことがわかりました。さらに調査した結果、LEFT OUTER 結合に追加されたバッチ ID が問題を引き起こしていることがわかりました。11g では完全に機能していました。
質問
次のクエリが 11g では LEFT OUTER JOIN として扱われるのに、Exadata では INNER JOIN として扱われるのはなぜですか?
SELECT
*
FROM DIM_CALL CALLS
LEFT OUTER JOIN FACT_ACTVY_MNGMT ACTVY_MNGMT
ON ACTVY_MNGMT.CALL_KEY = CALLS.CALL_KEY
AND ACTVY_MNGMT.BATCH_ID = 20141112
LEFT OUTER JOIN DIM_ACTVY ACTVY
ON ACTVY.ACTVY_KEY = ACTVY_MNGMT.ACTVY_KEY
AND ACTVY_MNGMT.BATCH_ID = 20141112
アップデート
ETL プロセスで使用されたクエリにタイプミスがあったか、元の開発者がこのケースを見落としていたようです。最後の結合を見ると、結合が ACTVY_KEY と BATCH_ID にあることがわかります。問題は、参照している BATCH_ID が ACTVY_MNGMT テーブルからのものであることです。データベースは基本的にこれを WHERE 句として扱うため、CALL_KEY が NULL の場合は失敗します。