嵌套查询与jOINs

时间:2010-07-30 20:01:45

标签: sql-server tsql

如果我使用nestted subqueryJOINstemp 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 :)

4 个答案:

答案 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进行选择将首先拉入所有记录,然后执行过滤,因此速度要慢得多。

一路加入!!