2010-07-22 29 views
6
select * 
from ContactInformation c 
where exists (select * from Department d where d.Id = c.DepartmentId) 

select * 
from ContactInformation c 
inner join Department d on c.DepartmentId = d.Id 

兩個查詢給出了相同的輸出,這是良好的性能明智的聯接或相關子查詢與存在的條款,哪一個更好。聯接或相關子查詢與存在的條款,哪一個更好

編輯:-is有alternet方式進行連接,以提高性能: - 在上述2箇中查詢我想從部門信息以及contactinformation表

回答

5

通常,EXISTS子句是因爲您可能需要DISTINCT才能爲JOIN提供預期的輸出。例如,如果對於ContactInformation行有多個Department行。

在你上面的例子中,SELECT *

  • 意味着不同的輸出也因此它們實際上不是等同
  • 使用
  • 少了指數的機會,因爲你拉的所有列了

即使列名有限,他們也會給出相同的計劃:直到你需要DISTINCT ...這就是爲什麼我說「EXISTS」

+0

偉大..我有它。 – hrishi 2010-07-22 07:01:16

+0

編輯: - 有連接的alternet方式,以提高性能: - 在上述2個查詢中,我需要來自部門的信息以及聯繫人信息表 – hrishi 2010-07-24 06:02:52

4

你需要衡量和比較 - 有沒有黃金法則哪一個更好 - 它取決於系統中太多的變量和事物。

在SQL Server Management Studio中,您可以將兩個查詢都放入窗口中,從查詢菜單中選擇Include actual execution plan,然後將它們一起運行。

alt text http://i31.tinypic.com/2rw48s2.png

你應該得到的都自己執行計劃的比較和大部分的時間是如何度過的一個或另一個查詢的百分比。很可能,在這種情況下,兩者都將接近50%。如果不是,那麼你知道哪個查詢性能更好。

您可以從Simple-Talk瞭解有關SQL Server執行計劃的更多信息(甚至可以下載免費電子書) - 強烈推薦。

1

您的第一個查詢應該輸出部門列,而第二個查詢不應該。

如果您只對ContactInformation感興趣,則這些查詢是等效的。您可以運行它們並檢查查詢執行計劃以查看哪個運行更快。例如,在MYSQL上,where exists對於可空列是更高效的,而inner join如果兩列都不可爲空性能會更好。

2

我假設您要麼在第二個查詢中添加DISTINCT關鍵字到SELECT子句(或者,部門只有一個聯繫人的可能性較小)。

首先,始終以「邏輯」考慮開始。可以說,EXISTS的構造更直觀,因此,所有「物理」的東西都是平等的,我願意這樣做。其次,將會有一天你需要移植這個代碼,而不一定是一個不同的SQL產品,但是,也就是說,相同的產品,但使用不同的優化器。一個體面的優化者應該認識到兩者都是相同的,並提出相同的理想計劃。考慮到理論上,EXISTS構造具有稍微更多的短路可能性。

第三,使用合理的大型數據集進行測試。如果性能不可接受,請開始考慮「物理」考慮因素(但我建議您始終保留您的'邏輯純'代碼在即將到來的日子當完美的優化器到達時留下評論:)

相關問題