2016-11-25 62 views
0
Select count (*) 
from table 
where id in (1,2,3,4,5,6.....500) 

這些ID通過某個腳本在外部填充。只要In參數超過一定數量的條目,查詢就會減慢6次。SQL Server性能問題。當「參數」記錄的數量增加時,查詢性能顯着降低

任何建議或幫助將不勝感激

+2

難道你不能只是將這些數字存儲到一個臨時表中,然後做一個普通的'INNER JOIN'?我認爲這將比具有大量值的'IN'操作快得多 –

+0

聽起來像你需要閱讀這個主頁:http://sommarskog.se/dyn-search.html –

+1

在內部,一個'IN'子句被擴展爲優化器阻塞的一堆'OR',所以這本質上不能縮放。根據marc,使用臨時表或表變量。如果你不能,另一個選擇是加入一個使用表值構造函數填充表的子查詢。這些限制在1000行以防止這類問題,但如果這個限制不是問題,它們應該比一個巨大的「IN」更快。 –

回答

1

正如在評論中有人建議,你可以對它們使用臨時表填充向外部產生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子句中使用的參數中的值的總數,該值應該很好。

希望這有助於!

+0

嗯,最後的聲明...... OP可以有一個身份證的表,並不能保證不會有空白。所以,「IN ...」會有一定意義。但是,如果列表中包含1到500之間的所有數字,我會寫'WHERE id BETWEEN 1 AND 500'。我認爲OP只是給了一個任意的例子,他的RL案例可能會有所不同。 –

+0

@TT。是的,這是絕對正確的。但是,我們不知道OP的具體情況,我們只是在猜測。正如我們都提到的,這很可能是一個例子,OP實際上有一個更復雜的查詢。 –