2010-07-30 140 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