2014-10-29 74 views
0

我发现了一些关于IN,JOINS和EXISTS的信息,并且还有效率。但对我而言,我的问题从未真正回答过,或者答案没有明确说明。 我的例子产生相同的结果。DB2 - IN与JOINS的联系

这里有两个例子:

SELECT COUNT(DISTINCT A.ID) 
    FROM A 
     ,B 
     ,C 
WHERE A.ID = B.ID 
    AND B.ID = C.ID 
    AND 'SOME OTHER CONDITIONS'; 

SELECT COUNT(DISTINCT A.ID) 
    FROM A 
WHERE A.ID IN (SELECT DISTINCT B.ID 
        FROM B 
         ,C 
       WHERE B.ID = C.ID 
        AND 'SOME CONDITION') 
    AND 'SOME CONDITION'; 

运行针对数亿行的,就是其中一个明显的比其他的更熟练?

+0

......它将完全取决于每个表格中的值的分布以及您拥有的指标。所以我们不能没有更多的信息来回答问题,你可能会更好地自己回答这个问题。一般而言,(内部)连接倾向于允许优化器尽快删除不匹配的行,但如果您有重复的行,则可能会增加“DISTINCT”所需的资源。在某些情况下,优化器可能为这两个查询生成相同的计划。 – 2014-10-30 10:12:37

+0

'......其中一个明显比另一个明显?'如果(就像你在你的问题中所说的那样)“{你的}例子产生相同的结果。”如果您的情况更好,结果应该在资源使用或时间方面有所不同。 – user2338816 2014-10-31 04:37:59

回答

0

我在SQL中用100000条记录和一个非常类似的没有条件的查询来试用它,并且看到了执行计划。两者的输出结果相同。 两者的查询成本均为50%。 另外,对于统计信息,1st上的table1上的3891个物理读取和table1上的425个物理读取,而另一个上的table1上的4593个物理读取和table1上的79个物理读取。两个查询的逻辑读取和预读读取几乎相似。 显然,两个查询的工作方式都是一样的。

我的查询

Select count(distinct table1.column) 
From table1 join table2 
on table1.column= table2.column; 

Select count (distinct column) 
From table1 
Where column in 
     (Select distinct column 
      from table2); 

但是,当我使用Select column而不是count(distinct column)即没有聚集,连接相比,它有95%和所有读取其他有5%的查询的成本是多少次少于连接。

因此,对于非聚合查询,“连接”比“In”更有效。

0

我认为这取决于你从内部选择“消除”多少行。如果inner select返回少量行,则执行“IN”会更快。但是我不认为会有太大的区别,也许第一个例子可能会使用更多的内存,因为它需要在内存中存储三个表的整个笛卡尔积。

未经请求的提示:请写下你的加入条件,如下所示:FROM B JOIN C ON (B.ID = C.ID),这样会更清楚,在你的WHERE子句中,你只会有必要的条件。任何地方这不会影响性能,这只是一个建议