早期觀點: IN 不符合 SARG(Search ARGument),導致全表掃描。
現代事實: SQL Server 2005+ 優化器可將 IN 轉為多個 OR 或 UNION ALL 邏輯,充分利用索引尋找。
member(百萬級),proxyID 有非聚集索引。SELECT ... FROM member WHERE proxyID IN ('ID1','ID2',...,'ID30');
SELECT ... FROM member WHERE proxyID = 'ID1'
UNION ALL
SELECT ... FROM member WHERE proxyID = 'ID2'
...
Index Seek 配合 IN 範圍尋找,邏輯極簡,編譯耗時極低。Index Seek + Concatenation,計劃極長,編譯/優化開銷大,計劃緩存膨脹。| 指標 | IN 列表 | UNION ALL |
|---|---|---|
| 編譯時間 | 極低 | 高(隨列表增長線性增長) |
| 計劃緩存 | 單一計劃 | 參數化困難,易產生大量計劃 |
| 運行時 I/O | 相近 | 相近 |
| 可維護性 | 優 | 差 |
sp_executesql 或 ORM 參數化,復用計劃。IN 早已不是性能殺手。理解 SARG 現代定義、信任優化器、善用參數化,才是高性能 SQL 的正道。