SQL Server Join 連接和笛卡爾積問題


以前學習sqlserver join的時候以為連接都是笛卡爾積方式連接。后面看到經典的SQL Server join連接的算法。

感覺有疑問,故查閱資料並做測試整理下:

一、(多表)連接方式分類

     T-SQL提供兩種連接方式:傳統方式和SQL連接方式

      1.傳統方式:SELECT 列1,列2,列3.... FROM  表1,表2,表3... WHERE condition

            這種方式會把表1,2,3做笛卡爾積(根據測試結果推測,不一定准確)

      2.SQL連接方式:

            1>.INNER JOIN,內聯,系統默認,相當於JOIN 。返回多表之間完全匹配的結果。

2>.LETF JOIN ,左聯,返回除了有完全匹配的結果還有左表所有行。

3>.RIGHT JOIN ,右聯,返回除了有完全匹配的結果還有右表所有行。

4>.Full JOIN ,完全外鏈接,返回除了有完全匹配的結果還有左右表所有行。

其中LETF JOIN、RIGHT JOIN和Full JOIN 均屬於外連接(OUTER JOIN)

5>.CROSS JOIN,交叉連接,又稱為自然連接,即生成一個笛卡爾積。(應該類似於傳統方式)

二、SQL Server JOIN 內部實現的三種算法:

    1. Loop join(嵌套循環),   即首先遍歷 A,將A表中的每一條記錄與 B表進行連接比較,如果滿足A.di=B.id,則返回記錄;
    2. Merge join(合並連接), 即首先對A,B表進行排序,然后同時遍歷A和B表,進行A.id=B.id的驗證,直到遍歷到A和B表結束;
    3. Hash join(哈希連接), 即首先對A表所有記錄的id進行hash計算,最終形成一個hash表,然后join時,遍歷B表,對B表每條記錄的id進行hash運算,然后在A的Hash表中驗證是否一致,最后得出結果。

 

個人分析,SQL連接方式只是技術和SQL Server交互的連接方式。內部實現的三種算法是根據T-SQL分析並選擇具體的實現算法,僅個人理解。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM