天天看點

SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言

本節我們來講講聯接綜合知識,我們在大多教程或理論書上都在講用哪好,哪個性能不如哪個的性能,但是真正講到問題的實質卻不是太多,是以才有了本系列每一篇的篇幅不是太多,但是肯定是我用心去查找許多資料而寫出,簡短的内容,深入的了解,Always to review the basics。

接下來我們看第一篇聯接綜合知識講解INNER JOIN和IN的比較分析,我們通過建立表來看INNER JOIN。

建立測試表1

插入測試資料

建立測試表2并插入資料

接下來我們對測試表1和測試表2中的SomeColumn和IntCol進行JOIN

SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言

此時我們看到兩個測試表中都傳回7行資料,因為在測試表2中有重複的資料都比對上所有測試表1傳回所有資料。此時我們再來看看IN的查詢

SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言

此時則傳回5條資料,從這裡我們知道INNER JOIN和IN還是有很大的差別,但是若在測試表2中沒有重複的資料,同時在測試表2中沒有需要的列,此時則查詢出的資料和測試表1是一樣的,此時二者在性能上有什麼差別呢?接下來我們在建立大量資料的前提下來進行測試看看。

建立兩個測試表

在BigTable表SomeColumn列中插入100萬條資料

取出BigTable中的25%資料插入到SmallerTable表LookupColumn列中

這裡我們分三種情況來測試。

(1)未建立索引比較INNER和JOIN

SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言
SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言

從上看出此時在無論是查詢開銷還是IO上均沒有什麼差異,下面我們再來看看建立索引的情況

(2)建立非唯一非聚集索引比較INNER JOIN和IN

SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言
SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言

此時我們發現在建立非唯一非聚集索引的情況二者在查詢開銷上開始有了比較大的差異,INNER JOIN的開銷是IN的兩倍而IO幾乎是等同的。

(3)建立唯一非聚集索引比較INNER JOIN和IN

SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言

此時為何索引變為唯一聚集索引二者性能開銷卻一緻了呢?有點納悶,同時到這裡為止是不是說明IN的查詢性能比JOIN的性能更好呢,完全颠覆我們的想法,在本文前言我們讨論過在教程中都會給出大部分JOIN比EXISTS性能好,而EXISTS比IN性能好,凡是還是動手實踐,親自驗證才是王道,我們隻能得出一般性結論:一般來說,JOIN比EXISTS性能好,而EXISTS比IN性能好僅此而已。這都是一般性情況,本系列需要講述的是什麼時候應該用EXISTS,什麼時候應該用JOIN,還有什麼時候應該用IN,後續内容會陸續讨論這些内容。好了,有點跑題了,上述我們通過100萬條資料得出IN的性能接近是INNER JOIN性能的兩倍,完全出乎你我的意料,帶着這個疑問,接下來我們進一步進行探讨。

上述在SmallerTable表從BigTable表中取出的25%的資料都是唯一的,接下來我們将這25%資料的一部分設定為重複的。我們随便從BigTable表中取出SomeColumn這列的資料,然後将SmallerTable表中的LookupColumn這列的資料設定重複的10000條,如下

此時我們查詢包括重複的這10000條

SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言

此時結果還是IN性能比INNER JOIN性能要接近一半,接下來我們在查詢SmallerTable表時将重複的LookupColumn列資料去除,此時我們查詢變為如下:

SQL Server-聚焦INNER JOIN AND IN性能分析(十四)前言

終于查詢開銷和上述不一樣了,此時二者查詢性能開銷是一緻的,相信到了這裡我們應該很清楚了。通過上述大量篇幅的貼圖和比較我們可以得出INNER JOIN和IN的性能開銷使用場景,當我們在初步探讨INNER JOIN和IN的性能分析時,當建立非唯一聚集索引時IN性能接近是INNER JOIN的兩倍,而當建立唯一聚集索引時,此時性能開銷一緻,不免有點納悶,當我們繼續向下探讨時終于明白了這個原因,至此我們最終得出INNER JOIN和IN的性能開銷結論。

INNER JOIN和IN性能開銷結論:當INNER JOIN表中列資料是唯一的,此時INNER JOIN和IN的性能開銷是相同的,當INNER JOIN表中列資料是重複的,此時IN性能要INNER JOIN要好。

本節我們詳細叙述了INNER JOIN和IN的性能分析,最終得出一緻性結論,下節我們開始讨論NOT EXISTS和NOT IN性能分析,簡短的内容,深入的了解,我們下節再會,good night。