我有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;
答案 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。