优化SQL联接:在子查询中是不同的

优化SQL联接:在子查询中是不同的,sql,join,oracle11g,subquery,distinct,Sql,Join,Oracle11g,Subquery,Distinct,我环顾四周,虽然我觉得我的问题是基本的,但我没有看到任何直接解决这个问题的方法:在子查询中使用DISTINCT与在最终SELECT语句中指定它相比有什么影响?为什么 给定两个表TABLE_A和TABLE_B,每个表都有一个唯一的变量和两个索引,INDEX_ONE和INDEX_two,分别大约有5000万行和50000行。。。DISTINCT的哪种用法更经济 SELECT /*+ USE_HASH(A B) LEADING(B A) ALL_ROWS */ DISTINCT

我环顾四周,虽然我觉得我的问题是基本的,但我没有看到任何直接解决这个问题的方法:在子查询中使用DISTINCT与在最终SELECT语句中指定它相比有什么影响?为什么

给定两个表TABLE_A和TABLE_B,每个表都有一个唯一的变量和两个索引,INDEX_ONE和INDEX_two,分别大约有5000万行和50000行。。。DISTINCT的哪种用法更经济

    SELECT /*+ USE_HASH(A B) LEADING(B A) ALL_ROWS */
     DISTINCT
      INDEX_ONE,
      INDEX_TWO,
      VARIABLE_A,
      VARIABLE_B
    FROM (SELECT 
           INDEX_ONE,
           INDEX_TWO,
           VARIABLE_A
          FROM
           TABLE_A) A
    INNER JOIN
         (SELECT 
           INDEX_ONE,
           INDEX_TWO,
           VARIABLE_B
          FROM
           TABLE_B) B
    ON A.INDEX_ONE = B.INDEX_ONE
    AND A.INDEX_TWO = B.INDEX_TWO

我还想知道是否有比这里更快的方法,以及具体原因

编辑: 在看过keiv.fly的评论后,我也会加入这一条:

    SELECT /*+ USE_HASH(A B) LEADING(B A) ALL_ROWS */
     DISTINCT
      INDEX_ONE,
      INDEX_TWO,
      VARIABLE_A,
      VARIABLE_B
    FROM TABLE A A
    INNER JOIN TABLE_B B
    ON A.INDEX_ONE = B.INDEX_ONE
    AND A.INDEX_TWO = B.INDEX_TWO

子查询对性能不利。如果删除子查询,很可能不会有任何区别,因为DB将根据其知识(统计数据和估计执行时间)选择最佳方式。如果这对您有帮助,我可以为所有三种变体编写基准测试。我不希望您经历所有这些麻烦,我在寻找一个基本的启发性理解,了解每一个都是如何影响计划的。此外,我在本例中简化了表,但通常情况下,子查询将列空间从20减少到3会比完全取消子查询在时间上产生更少的减少吗?子查询不一定对@keiv.fly的性能有害。。。如果有一半的机会,甲骨文将进行大量优化。不正确使用数据库的SQL对性能不利,这可能会成为一个子查询。我不知道Oracle是如何工作的,但据我所知,子查询会锁定MySQL和MSSQL中的执行计划。因此,如果计划不太好,这可能会显著降低性能。
    SELECT /*+ USE_HASH(A B) LEADING(B A) ALL_ROWS */
     DISTINCT
      INDEX_ONE,
      INDEX_TWO,
      VARIABLE_A,
      VARIABLE_B
    FROM TABLE A A
    INNER JOIN TABLE_B B
    ON A.INDEX_ONE = B.INDEX_ONE
    AND A.INDEX_TWO = B.INDEX_TWO