如果我使用nestted subquery
,JOINs
或temp tables
,那么效率可能更高。
另一个问题:在子查询中,如果我使用相同的查询两次IN子句,它应该执行两次!像这样:
Select ...
From X
Where Exists( Select 1 From Y Where Idx = Y.SomeColumn )
Or Exists( Select 1 From Y Idy = Y.SomeColumn )
在此查询中可以执行子查询SELECT * FROM Y
的次数!
如果我用这种方式这样做会怎么做:
With XX As
(
Select ...
From Y
)
Select ...
From X
Where Exists ( Select 1 From XX Where Idx = XX.SomeColumn )
Or Exists ( Select 1 From XX Where Idy = XX.SomeColumn )
thanx :)
答案 0 :(得分:4)
这两个查询是等价的,应该生成相同的计划。这是一种误解,即CTE只编译一次,从而提供了性能优势。非递归CTE只是派生表/内联视图的语法糖(IMO错误地称为子查询)。
其次,JOINs与IN / EXISTS可以产生不同的结果。如果有两个或更多支持记录,则JOIN会冒重复数据的风险。如果存在重复的标准,则最好使用EXISTS,因为它在第一次遇到标准时返回true - 使其可能比IN或JOIN更快。使用EXISTS或IN时没有数据重复风险。
答案 1 :(得分:2)
使用SQL Server Management Studio中的执行计划,亲自查看数据库的运行速度。
答案 2 :(得分:2)
首先,您的语法可能不正确。因此,这两种格式如下:
Select ...
From X
Where Exists( Select 1 From Y Where Idx = Y.SomeColumn )
Or Exists( Select 1 From Y Idy = Y.SomeColumn )
并且
With XX As
(
Select ...
From Y
)
Select ...
From X
Where Exists ( Select 1 From XX Where Idx = XX.SomeColumn )
Or Exists ( Select 1 From XX Where Idy = XX.SomeColumn )
注意存在的陈述。它们不是Where Col Exists(...
,而只是Where Exists( ...
。
其次,效率和速度将取决于数据,统计数据,索引,以及在一天结束时,优化程序能够提高效率。因此,您确实需要查看执行计划以了解哪个更快。现在,另一种形式可能是:
Select ...
From X
Where Exists (
Select 1
From Y
Where Idx = Y.SomeColumn
Union All
Select 1
From Y
Where Idy = Y.SomeColumn
)
答案 3 :(得分:0)
加入比你提出的其他建议快得多。
连接将为每个记录执行ON条件,而使用WHERE进行选择将首先拉入所有记录,然后执行过滤,因此速度要慢得多。
一路加入!!