SELECT table1.ID
FROM table1
INNER JOIN table2 ON table1.ID = table2.ID
WHERE table2.col2 = 'xxx';
潛在問題:若 table2 資料量大且 col2 無索引,優化器可能選擇掃描全表再 JOIN,導致大量 I/O。
SELECT a.ID
FROM table1 a
INNER JOIN (
SELECT col1, ID
FROM table2
WHERE col2 = 'xxx'
) b ON a.ID = b.ID;
b 僅包含符合條件的資料列與必要欄位(ID、col1),資料量大幅縮減。table2 有 (col2, ID, col1) 覆蓋索引,衍生表可直接索引掃描,完全避免鍵查找。SELECT a.ID, ca.col1
FROM table1 a
CROSS APPLY (
SELECT TOP 1 col1, ID
FROM table2
WHERE table2.ID = a.ID AND col2 = 'xxx'
) ca;
CROSS APPLY 適用於「每筆主表資料只需對應一筆從表資料」的場景,可進一步避免掃描整張從表。
SET STATISTICS IO, TIME ON;
-- 執行兩種寫法,比較 logical reads、CPU time、elapsed time
重點觀察 logical reads 減少幅度與執行計畫中 Estimated Rows 是否接近 Actual Rows。