我有两条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;发布于 2014-07-02 14:50:16
第二个查询可以更快,因为它从第一个查询缓存的SGA区域读取数据。换句话说,第一个查询使用硬解析,第二个查询使用软解析,因为它们具有相同的执行计划。尝试多次运行这两个查询,以确定第二个查询是否仍然更快。
发布于 2014-07-03 06:13:28
SQL 1:
在这里,sql engine首先联接表BLIS_ADDRESSREFERENCE和BLIS_ADDRESS,然后应用WHERE谓词来筛选记录。
SQL 2:
在这里,sql引擎首先从表BLIS_ADDRESSREFERENCE中筛选记录,然后与BLIS_ADDRESS表联接。我猜SQL2会更快,因为来自BLIS_ADDRESSREFERENCE的过滤记录比BLIS_ADDRESS要小。
https://stackoverflow.com/questions/24524194
复制相似问题