Oracle SQL:在子查询中或在连接之后使用WHERE子句是否更有效?

时间:2016-05-06 23:13:55

标签: sql oracle

我想知道哪种更有效,为什么:

示例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子句的记录?

(注意:查询看起来根据客户密钥将客户信息与交易信息联系起来。客户密钥对于客户表是唯一的。两个查询都产生相同的输出。)

1 个答案:

答案 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有一个智能优化器,应该优化子查询。但是,它可能会错过一两个特定情况,这就是您应该查看自己的查询的原因。