背景
最近我公司从 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 的任何情况都会导致失败。