Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪种SQL具有更好的性能?_Sql_Oracle - Fatal编程技术网

哪种SQL具有更好的性能?

哪种SQL具有更好的性能?,sql,oracle,Sql,Oracle,我有两条sql语句,如下所示。它们可以检索相同的数据集。正如我所测试的,SQL2似乎总是有更好的性能。我解释了这两种说法。他们有相同的执行计划 有人能解释一下在这里使用子查询是否会影响性能吗? 我们如何使用子查询进行sql调优 非常感谢 --SQL 1 SELECT ADDRRF.ENTITYKEYID, ADDRESS1, ADDRESS2 FROM WODS_STG.BLIS_ADDRESSREFERENCE ADDRRF LEFT JOIN WODS_STG.BLIS_AD

我有两条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;

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

SQL 1:

在这里,sql引擎首先连接表、BLIS_ADDRESSREFERENCE和BLIS_ADDRESS,然后应用WHERE谓词过滤记录

SQL 2:


在这里,sql引擎首先从BLIS_ADDRESSREFERENCE表中筛选记录,然后与BLIS_ADDRESS表联接。我想SQL 2更快,因为BLIS_ADDRESSREFERENCE中的筛选器记录比BLIS_ADDRESS小

请给我们看一下执行计划。您也可以在SQL*Plus中使用
set autotrace traceonly
,以查看有关语句执行的更多详细信息(有关详细信息,请参阅手册)。我猜第二个查询的性能更好,因为您首先过滤结果,然后离开并加入它们。@CiucaS:它不会产生影响。Oracle在构建执行计划时在内部执行大量转换。就我所见,这两个查询在功能上是相同的。Sasfan,在你的问题中发布两个执行计划,不要从计划中去掉“谓词”部分。谢谢。你要从中键入单词
,而不是“frin”,是吗?我同意@a_horse_和_no_name,我们需要了解这些查询的解释计划,但在此之前不要忘记收集统计数据
DBMS_STATS.gather_schema_STATS(…
缓存显然可能是造成这种差异的原因。但我怀疑软解析和硬解析是否相关;硬解析发生在稍微不同的文本上,执行计划是否相同并不重要。你完全正确,但这是我在没有查询解释计划的情况下的唯一想法。不太可能n Oracle SQL语句的执行顺序与编写顺序相同。在这种情况下,几乎肯定会使这两个查询以相同的方式运行。是的,我写了我猜测的内容。有许多因素决定了查询计划。要了解查询执行后的实际情况,我必须使用dbms_xplan.display_cursor()为了找出答案。Oracle解析查询,然后根据统计信息选择最佳计划。如果作者指定了一些关于连接顺序等的提示,您的结论将是正确的。