2010-07-30 99 views
7

卫生组织可能是很多有效的,如果我用nestted subqueryJOINs也许temp tables .. 另一个问题:在子查询,如果我有相同的查询两次使用IN子句应该过于执行两次!?像这样:嵌套查询VS加入

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) 

感谢名单:)

回答

4

这两个查询是等价的,应该产生相同的计划。这是一个误解,CTE只编译一次,提供了性能优势。非递归CTE只是派生表/内联视图的语法糖(IMO错误地称为子查询)。其次,JOIN与IN/EXISTS可以产生不同的结果。如果有两个或更多支持记录,联接风险重复的数据。如果存在重复的条件,则最好使用EXISTS,因为它在条件的第一次遇到时返回true - 使其可能比IN或JOIN更快。使用EXISTS或IN时没有数据重复风险。

+0

thanx很多人:) – Rawhi 2010-08-01 09:49:23

0

加入远远比你提出的其他建议更快。

连接将为每条记录执行ON条件,而用WHERE进行选择将首先获取所有记录,然后执行过滤器,因此速度会更慢。

一路加入!

+0

但是,如果我应该使用它与它不同,它将不会像其他人那么快。对吧? – Rawhi 2010-07-30 20:10:33

+0

@保罗诅咒,你打败了我。 – 2010-07-30 20:11:50

+0

AHA ....... !!!! – Rawhi 2010-07-30 20:19:27

2

在SQL Server Management Studio中使用执行计划并查看自己对数据库的运行速度。

+0

我试图下载它,但我失败了! – Rawhi 2010-07-30 20:59:04

+0

快递版本一应俱全,通常可以运作:http:// www。microsoft.com/downloads/details.aspx?familyid=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&displaylang=en – 2010-07-30 21:02:16

2

首先,你的语法可能是incorrect.Thus,这两种格式将如下所示:

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) 

注意EXISTS的语句。他们不是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 
       ) 
+0

thanx .......:D – Rawhi 2010-08-01 16:48:35