我想知道哪种更有效,为什么:
示例1:
SELECT a.CUSTOMER_KEY a.LAST_NAME b.TRASACTION_AMT,
FROM CUSTOMER_TABLE a
LEFT JOIN TRANSACTION_TABLE b
ON a.CUSTOMER_KEY = b.CUSTOMER_KEY
WHERE b.DATE_TRANSACTION > 20150101 AND a.CUSTOMER_ACTIVE_FLAG = 'Y';
或示例2:
SELECT a.CUSTOMER_KEY a.LAST_NAME b.TRASACTION_AMT,
FROM
(SELECT *
FROM CUSTOMER_TABLE
WHERE CUSTOMER_ACTIVE_FLAG = 'Y') a
LEFT JOIN
(SELECT *
FROM TRANSACTION_TABLE
WHERE b.DATE_TRANSACTION > 20150101) b
ON a.CUSTOMER_KEY = b.CUSTOMER_KEY
例如,选项2是否会更好地优化,因为它会过滤掉不满足where子句的记录?
(注意:查询看起来根据客户密钥将客户信息与交易信息联系起来。客户密钥对于客户表是唯一的。两个查询都产生相同的输出。)
答案 0 :(得分:2)
没有join
的正确等效查询是:
SELECT a.CUSTOMER_KEY a.LAST_NAME b.TRASACTION_AMT,
FROM CUSTOMER_TABLE a LEFT JOIN
TRANSACTION_TABLE b
ON a.CUSTOMER_KEY = b.CUSTOMER_KEY AND b.DATE_TRANSACTION > 20150101
WHERE a.CUSTOMER_ACTIVE_FLAG = 'Y';
第二个表格中的条件是ON
子句。
最好的方法是查看两个查询的执行计划和运行时间。我希望等效版本具有相同的执行计划。 Oracle有一个智能优化器,应该优化子查询。但是,它可能会错过一两个特定情况,这就是您应该查看自己的查询的原因。