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

SQL Server `IN` 子查詢效能優化:改用 `EXISTS`、`JOIN` 或臨時表

     編輯:程式設計綜合問答

原始語句


UPDATE t1 SET A = A + 1 WHERE id IN (SELECT id FROM t2 WHERE B = 1);
-- 資料量幾十萬,效能不佳

優化方案比較

方案SQL 範例適用場景原理
EXISTSUPDATE t1 SET A=A+1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.id=t1.id AND t2.B=1);外部表大、內部表小、有索引半連接,滿足一筆即停止掃描
INNER JOINUPDATE 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;子查詢複雜、需重複使用將子查詢物化,避免重複計算
MERGEMERGE 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。
  • 大量更新分批次(每批 5000-10000),避免鎖升級與日誌暴增。
  • 開啟 SET STATISTICS IO, TIME ON 對比執行計畫。

原答案參考

「SqlServer中in和exists的區別效率問題...」

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