Select count (*)
from table
where id in (1,2,3,4,5,6.....500)
這些ID通過某個腳本在外部填充。只要In
參數超過一定數量的條目,查詢就會減慢6次。SQL Server性能問題。當「參數」記錄的數量增加時,查詢性能顯着降低
任何建議或幫助將不勝感激
Select count (*)
from table
where id in (1,2,3,4,5,6.....500)
這些ID通過某個腳本在外部填充。只要In
參數超過一定數量的條目,查詢就會減慢6次。SQL Server性能問題。當「參數」記錄的數量增加時,查詢性能顯着降低
任何建議或幫助將不勝感激
正如在評論中有人建議,你可以對它們使用臨時表填充向外部產生ID
的,然後join
。你可以創建臨時表這樣:
Create table #TEMP(ID INT)
INSERT INTO #TEMP (ID) VALUES
(1), (2), (3), (4), (5) --Populate this with parameter as ID's are externally generated.
然後join
這樣:
Select t.*
from table t
inner join #Temp temp on t.ID = temp.ID
我衷心希望這是一個例子,你實際上並沒有試圖做到這一點:
Select count (*)
from table
where id in (1,2,3,4,5,6.....500)
,因爲如果你的情況,ID
的是唯一的(他們大多是),並沒有被刪除(這是相當常見的做法),那麼IN
子句中的的總數將是COUNT(*)
的結果,在這種情況下,您不必具有IN
子句。您可以計算您打算在IN
子句中使用的參數中的值的總數,該值應該很好。
希望這有助於!
嗯,最後的聲明...... OP可以有一個身份證的表,並不能保證不會有空白。所以,「IN ...」會有一定意義。但是,如果列表中包含1到500之間的所有數字,我會寫'WHERE id BETWEEN 1 AND 500'。我認爲OP只是給了一個任意的例子,他的RL案例可能會有所不同。 –
@TT。是的,這是絕對正確的。但是,我們不知道OP的具體情況,我們只是在猜測。正如我們都提到的,這很可能是一個例子,OP實際上有一個更復雜的查詢。 –
難道你不能只是將這些數字存儲到一個臨時表中,然後做一個普通的'INNER JOIN'?我認爲這將比具有大量值的'IN'操作快得多 –
聽起來像你需要閱讀這個主頁:http://sommarskog.se/dyn-search.html –
在內部,一個'IN'子句被擴展爲優化器阻塞的一堆'OR',所以這本質上不能縮放。根據marc,使用臨時表或表變量。如果你不能,另一個選擇是加入一個使用表值構造函數填充表的子查詢。這些限制在1000行以防止這類問題,但如果這個限制不是問題,它們應該比一個巨大的「IN」更快。 –