2011-05-17 21 views
1

我應該關心數組中有數百個值的IN表達式嗎?例如:NHibernate限制。與數百個值

myCriteria.Add(Restrictions.In("Id", myArrayOfHundredsOfItems); 

這會導致SQL:

select * from MyTable where Id in (1,2,3,4, ...etc .. 900) 

MSDN says「包括IN子句中一個非常大的數量值(成千上萬)會消耗資源並返回錯誤8623或8632 「。

好的,所以'成千上萬'是不可能的。是否有任何理由避免可能有幾百個項目的數組?

+0

你能澄清你的情況嗎?我認爲這是其中之一,「這取決於」的問題。有可能有更好的方法來做你想做的事情,但是沒有理解情況就沒有辦法給出有建設性的答案。 – csano 2011-05-17 06:52:04

回答

3

還有另一個限制。 IN子句中的值作爲單個參數傳遞。有一個參數的限制。這可能是same as for stored procedures這是2100.

我有類似的情況,我通過大量的指導。我把它分成幾個查詢,每個查詢最多有1000個參數。查詢在批處理中作爲多個條件執行,因此只有一個數據庫往返。

與連接相比,使用IN時性能可能受損。在我的情況下,我沒有任何性能問題因此。如果你沒有那麼多參數,那麼對你而言,這很可能不會成爲問題。

順便說一句,通過ID獲取對象也可以通過實現:

  • Get<Entit>(id),這需要一個單一的查詢,但只有當實體不在緩存中還沒有。
  • Load<Entity>(id),如果實體不在高速緩存中並僅在訪問屬性時加載,則創建代理。它最有可能使我們成批量並一次加載多個實例(預取)。

不幸的是,there isn't a future-get