首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL 效率對比:LEFT JOIN vs 笛卡爾積隱式連接

     編輯:程式設計疑難解答

兩條 SQL

-- SQL 1:顯式 LEFT JOIN
SELECT T3.ID, T3.NAME 
FROM ZY_UNIT_WARD T1 
LEFT JOIN XT_UNIT T2 ON T1.UNITID = T2.ID 
LEFT JOIN zy_ward T3 ON T2.ID = T3.UNITID 
WHERE T2.ID = 8;

-- SQL 2:舊式逗號連接(隱式內連接)
SELECT T1.ID, T1.NAME 
FROM zy_ward T1, XT_UNIT T2, ZY_UNIT_WARD T3 
WHERE T1.ID = T3.WARDID AND T2.ID = T3.UNITID;

效率結論

SQL 1 效率顯著高於 SQL 2。

原理分析

維度SQL 1 (LEFT JOIN)SQL 2 (逗號連接)
執行計劃優化器識別連接順序,可用 Hash Join / Merge Join易退化為笛卡爾積後過濾(Nested Loop),複雜度 O(N²)
語義清晰度連接條件與過濾條件分離混在 WHERE 中,難以優化
外連接支援原生 LEFT/RIGHT/FULL舊語法 (*=) 已棄用,不支援標準外連接
可維護性高低

深度解析 SQL 2 的隱患

FROM A, B, C WHERE ... 理論上先做 A × B × C 笛卡爾積,再按 WHERE 過濾。雖然現代優化器會嘗試重排,但複雜查詢時極易失誤,導致全表掃描、臨時表、性能雪崩。

最佳實踐

  • **永遠使用顯式 JOIN 語法**(INNER JOIN、LEFT JOIN 等)。
  • 連接條件寫在 ON,過濾條件寫在 WHERE。
  • 避免 SELECT *,只選需要的列。
  • 關鍵列建立索引(T2.ID、T3.UNITID 等)。

總結

SQL 1 採用標準顯式連接,優化器能生成高效計劃;SQL 2 使用過時的隱式連接,易產生笛卡爾積災難。**寫 SQL 時請堅持顯式 JOIN**,這是性能與可維護性的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved