2010-02-01 49 views
39

我一直在研究對一系列過程進行性能改進,最近一位同事提到他在使用INNER JOIN代替EXISTS時取得了顯着的性能改進。INNER JOIN可以提供比EXISTS更好的性能

作爲調查的一部分,爲什麼這可能是我想我會問這裏的問題。

所以:

  • 能的INNER JOIN提供更好的性能比存在?
  • 這會發生什麼情況?
  • 我該如何設置一個測試用例作爲證明?
  • 您有進一步文檔的任何有用的鏈接?

真的,任何其他的經驗,人們可以帶來這個問題。

我將不勝感激,如果任何答案可以解決這個問題,沒有任何其他可能的性能改進的建議。我們已經取得了相當程度的成功,而且我只對這一項感興趣。

任何幫助將不勝感激。

回答

39

一般來說,INNER JOINEXISTS是不同的東西。

前者返回兩個表中的重複項和列,後者返回一個記錄,並且作爲謂詞僅返回來自一個表的記錄。

如果您在UNIQUE列上執行內連接,它們會表現出相同的性能。

如果您在應用DISTINCT的記錄集上執行內部聯接(以刪除重複項),則EXISTS通常會更快。

INEXISTS條款(與等值連接相關性)通常採用的幾個SEMI JOIN算法,它通常比對錶中的一個的DISTINCT更有效的一個。

見我的博客文章:

+1

這有點偏離主題,但我會建議在返回不同的列表時避免使用DISTINCT並使用GROUP BY來獲得更好的性能。一般來說,DISTINCT的表現不如GROUP BY。它可能有助於彌補INNER JOIN和EXISTS之間的一些區別。 – EricI 2013-03-21 20:51:18

+4

@EricI:如果輸出結果完全相同,您能否提供一個查詢的例子,該查詢與'GROUP BY'比'DISTINCT'效率低?謝謝! – Quassnoi 2013-03-22 09:54:27

7

也許是,也許不是。

  • 同樣的計劃將是最有可能產生
  • 內部聯接可能需要DISTINCT得到相同的輸出
  • 存在具有NULL交易