我的一列只能包含4個可能的值(val1
,val2
,val3
,val4
)。TSQL - 更快使用IN(列表)或使用NOT IN(列表)作爲小列表?
我需要在WHERE
子句中添加一個額外的篩選器以排除這4個值之一(即val4
)。
使用NOT IN ('val4')
或IN ('val1','val2','val3')
會更快嗎?
我的一列只能包含4個可能的值(val1
,val2
,val3
,val4
)。TSQL - 更快使用IN(列表)或使用NOT IN(列表)作爲小列表?
我需要在WHERE
子句中添加一個額外的篩選器以排除這4個值之一(即val4
)。
使用NOT IN ('val4')
或IN ('val1','val2','val3')
會更快嗎?
NOT IN ('val4')
基本上等同於
WHERE
NOT (column = 'val4') /* or column <> 'val4' */
而IN ('val1', 'val2', 'val3')
基本上等同於
WHERE
(
column = 'val1'
OR
column = 'val2'
OR
column = 'val3'
)
我希望第一個選項是快,如果只是可以忽略不計。 SQL引擎可能會根據您在IN
函數中指定的值的數量以及您的表上可用的索引,對IN
進行不同的優化。你看到你在質疑使用方法的行爲是什麼?
檢查查詢計劃。如果Val4是非聚集索引,我敢打賭,這兩個計劃都是索引查找。
我測試過,不在,=和<>,並且所有的都是相同的查詢計劃。
如果他們有相同的查詢計劃,我懷疑實際的性能差異會大到足以看到。但我仍然會用單一的價值。
由於只有少數值,索引視圖可能會有最佳性能。
我通常會使用'!=',但我認爲我已經閱讀過(在SO),它並不總是最好的選擇,並可能導致性能問題。 – johntrepreneur
你說的話很有道理。只是尋找我可能會缺失的任何其他見解。 – johntrepreneur