UPDATE t1 SET A = A + 1 WHERE id IN (SELECT id FROM t2 WHERE B = 1);
-- 資料量幾十萬,效能不佳
| 方案 | SQL 範例 | 適用場景 | 原理 |
|---|---|---|---|
| EXISTS | UPDATE t1 SET A=A+1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.id=t1.id AND t2.B=1); | 外部表大、內部表小、有索引 | 半連接,滿足一筆即停止掃描 |
| INNER JOIN | UPDATE t1 SET A=A+1 FROM t1 JOIN t2 ON t1.id=t2.id WHERE t2.B=1; | 雙方資料量相近、皆有索引 | 雜湊/合併聯接,集合運算 |
| 臨時表/表變數 | DECLARE @ids TABLE(id INT PRIMARY KEY); INSERT @ids SELECT id FROM t2 WHERE B=1; UPDATE t1 SET A=A+1 FROM t1 JOIN @ids i ON t1.id=i.id; | 子查詢複雜、需重複使用 | 將子查詢物化,避免重複計算 |
| MERGE | MERGE t1 USING (SELECT id FROM t2 WHERE B=1) src ON t1.id=src.id WHEN MATCHED THEN UPDATE SET A=A+1; | 需同步 INSERT/UPDATE/DELETE | 單陳述式完成多操作 |
t2(B, id) 複合索引支援 WHERE B=1 篩選後直接取 id(覆蓋索引)。t1(id) 叢集索引(通常為 PK)。NOT IN 遇 NULL 會回傳空結果,改用 NOT EXISTS。SET STATISTICS IO, TIME ON 對比執行計畫。「SqlServer中in和exists的區別效率問題...」