2009-07-29 134 views
126

我有一個情況,使用JOIN或IN會給我正確的結果......通常有更好的性能,爲什麼?它依賴於你正在運行的數據庫服務器有多少? (FYI我正在使用MSSQL)SQL JOIN vs IN性能?

+0

對不起,我可能欺騙......沒發現這個問題時,我正在尋找 – Polaris878 2009-07-29 13:50:42

+0

:)我其實是在尋找,當我前一段時間研究後,類似的東西,並通過在一個偶然發現我使用了不同的文章錯誤 – AdaTheDev 2009-07-29 13:48:20

回答

153

一般來說,INJOIN是不同的查詢,可以產生不同的結果。

SELECT a.* 
FROM a 
JOIN b 
ON  a.col = b.col 

是不一樣的

SELECT a.* 
FROM a 
WHERE col IN 
     (
     SELECT col 
     FROM b 
     ) 

,除非b.col是獨一無二的。

然而,這是用於第一查詢同義詞:

SELECT a.* 
FROM a 
JOIN (
     SELECT DISTINCT col 
     FROM b 
     ) 
ON  b.col = a.col 

如果接合柱是UNIQUE並標記爲這樣,這兩個查詢產生相同的計劃中SQL Server

如果不是這樣,那麼IN比快於DISTINCT

看到這篇文章在我的博客的性能細節:

3

這很難說 - 爲了真正找出哪一個更好地工作,你需要真正地分析執行時間。作爲一般的經驗法則,我認爲如果你的外鍵列有索引,並且如果你只使用(或主要)INNER JOIN條件,那麼JOIN會稍微快一些。

但是,只要您開始使用OUTER JOIN,或者缺少外鍵索引,IN可能會更快。

馬克

+0

我也在想這個......因爲看起來JOIN是一個更常見的情況,並且更有可能被優化 – Polaris878 2009-07-29 13:49:43

23

滑稽你提到的是,我做了一個博客帖子在這個主題。

Oracle vs MySQL vs SQL Server: Aggregation vs Joins

簡短的回答:你要測試它與個人數據庫有很大的差異。

+3

Oooh,另一個不錯的插件:-) – paxdiablo 2009-07-29 13:43:37

+2

我不是自我推銷之上。 :) – cletus 2009-07-29 13:53:46

+2

@cletus:我真的很想註冊in-vs-join-vs-exist點com,收集所有插件並開始收錢: – Quassnoi 2009-07-29 14:05:57

1

優化器應該足夠聰明,可以爲普通查詢提供相同的結果。檢查執行計劃,他們應該給你同樣的事情。如果他們不這樣做,我通常會認爲JOIN速度更快。不過,所有的系統都是不同的,所以你應該在你的系統上確定代碼。

3

每個數據庫的實現,但你大概可以猜測,他們都以大致相同的方式解決常見問題。如果您正在使用MSSQL,請查看生成的執行計劃。您可以通過打開分析器和執行計劃來完成此操作。這會在運行命令時給你一個文本版本。

我不確定你使用的是哪個版本的MSSQL,但是你可以在查詢分析器中的SQL Server 2000中獲得一個圖形化版本。我確信這個功能潛伏在SQL Server Studio Manager的更高版本中。

看看計劃。儘可能避免表掃描,除非你的表很小,在這種情況下,表掃描比使用索引更快。閱讀每種不同場景產生的不同連接操作。

3

上的邏輯差異有趣新手必看:SQL Server: JOIN vs IN vs EXISTS - the logical difference

我敢肯定,假設關係,索引被維護一個Join將會更好地執行整體(更多的努力與其他人一起處理該操作)。如果你在概念上思考它,那麼它是2個查詢和1個查詢之間的區別。

您需要將其掛接到查詢分析器並嘗試它並查看其差異。同時查看查詢執行計劃並儘量減少步驟。

2

This Thread is pretty old,but still mentioned mentioned。對於我個人的品味來說,這有點不完整,因爲還有另一種方法可以用EXISTS關鍵字詢問數據庫,而我發現它的速度更快。

所以,如果你只對值感興趣,從表中您可以使用此查詢:

SELECT a.* 
FROM a 
WHERE EXISTS (
    SELECT * 
    FROM b 
    WHERE b.col = a.col 
    ) 

如果COL沒有被索引的差異可能是巨大的,因爲該數據庫沒有找到的所有記錄b在col中有相同的值,它只需要找到第一個。如果b.col上沒有索引並且b中有很多記錄,則可能會導致表掃描。使用IN或JOIN時,這將是一個全表掃描,EXISTS只是一個部分表掃描(直到找到第一個匹配記錄)。

如果在B A大量記錄,其具有相同的山坳值也將浪費大量的內存讀取所有的這些記錄到一個臨時的空間,只是爲了找到你的條件得到滿足。存在這通常可以避免。

我經常發現EXISTS比IN快,即使有索引。它依賴於數據庫系統(優化器),數據並且最後不僅限於所用索引的類型。