哪个SQL有更好的性能?

时间:2014-07-02 06:22:04

标签: sql oracle

我有2个sql语句,如下所示。他们可以检索相同的数据集。在我测试的时候,似乎SQL2总是有更好的性能。我解释了两个陈述。他们有相同的执行计划。

在这里使用子查询时,是否有人可以帮助解释是否影响性能? 我们如何使用子查询来进行sql调优?

非常感谢!

--SQL 1
SELECT ADDRRF.ENTITYKEYID,
    ADDRESS1,
    ADDRESS2
FROM WODS_STG.BLIS_ADDRESSREFERENCE ADDRRF
LEFT JOIN WODS_STG.BLIS_ADDRESS ADDR
    ON ADDRRF.ADDRESSID = ADDR.ADDRESSID
WHERE ADDRRF.ADDRESSTYPEID = 10
    AND ADDRRF.ENTITYID = 3;

--SQL 2
SELECT ADDRRF.ENTITYKEYID,
    ADDRESS1,
    ADDRESS2
FROM (
    SELECT *
    FROM WODS_STG.BLIS_ADDRESSREFERENCE
    WHERE ADDRESSTYPEID = 10
        AND ENTITYID = 3
    ) ADDRRF
LEFT JOIN WODS_STG.BLIS_ADDRESS ADDR
    ON ADDRRF.ADDRESSID = ADDR.ADDRESSID;

2 个答案:

答案 0 :(得分:2)

第二个查询可以更快,因为它从第一个查询缓存的SGA区域读取数据。换句话说,第一个查询使用硬解析而第二个使用软解析,因为它们具有相同的执行计划。尝试多次运行它们以查明第二个查询是否仍然更快。

答案 1 :(得分:0)

SQL 1:

这里,sql引擎首先加入表BLIS_ADDRESSREFERENCE和BLIS_ADDRESS,然后应用WHERE谓词来过滤记录。

SQL 2:

这里,sql引擎首先从表BLIS_ADDRESSREFERENCE中过滤掉记录,然后与BLIS_ADDRESS表连接。我猜SQL 2更快,因为BLIS_ADDRESSREFERENCE的过滤记录小于BLIS_ADDRESS。