為了將好幾個資料表的資料欄位一起呈現,我們會連接資料表。
例如 INNER JOIN
, LEFT JOIN
, CROSS JOIN
等等,這些連接是為了使用者的需求,可以稱之為 Logical Join (邏輯連接)。
SQL Server 包含了 Query Optimizer,會根據使用者的需求挑選最合適的 Physical Join (實體連接)方式。但是我們可以瞭解以下三種 Physical Join 在做什麼,當查詢變慢時才知道怎麼回事。
實體連接 | 說明 |
---|---|
Nested Loop Join | 直接掃描資料表連接,適合資料量較少的狀況,資料量變大就會掃描很久。 |
Hash Join | 先建立雜湊表,根據雜湊值快速取得資料,但是較耗記憶體空間。 |
Merge Join | 需要使用已排序過的資料作為查詢來源,適合已經建立索引的資料表。 |
減少連接的成本
連接時耗費過多時間要怎麼辦呢?
- 試著建立查詢需要的索引,更快查詢到需要的資料。因為編譯執行計畫時,可以產生更合適的索引類型 (如 Merge Join)。
- 連接時用條件篩選資料。減少資料的連接數量,就能減少耗費的時間
加入提示 (Hint)
為連接加入提示,可強制執行計畫使用特定連接方式。應該視為改善效能的最終手段,平時不使用。在某些 SQL 查詢內有用的提示,可能在其它查詢造成效能的反效果。
強制使用特定連接方式的語法:
LEFT LOOP JOIN
INNER MERGE JOIN
LEFT HASH JOIN
接著來看索引的知識:SQL Server 效能搶救 (5) 什麼是索引 – Lazy Coding