我找到了一些关于IN,JOINS和EXISTS的信息,并且有效率。但对我来说,我的问题从未得到真正回答,或者答案没有明确说明。 我的例子产生了相同的结果。
以下是两个例子:
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 :(得分:0)
我认为这取决于你从内部选择“消除”了多少行。如果内部选择返回几行,则执行“IN”将更快。但是我不认为会有太大的区别,也许第一个例子可能会使用更多的内存,因为它需要在内存中存储三个表的整个笛卡尔积。
未经请求的提示:写下这样的连接条件:FROM B JOIN C ON (B.ID = C.ID)
,它会更清楚,并且在WHERE子句中,您将只有必要的条件。这不会影响性能,只是一个建议
答案 1 :(得分:0)
我在SQL中尝试了100000条记录和一个非常类似的查询,没有条件,看到了执行计划。两者的输出结果相同。 两者的查询成本均为50%。 同样有统计数据,1st在table2上有3891个物理读取,在table1上有425个,而另一个在table2上有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)
即没有聚合时,加入的查询成本为5%,而另一个的查询成本为95%,所有读取的次数都少了很多倍联接。
因此,对于非汇总查询'加入'效率高于' In'。