2012-02-21 84 views
1

我正在尋找一種策略來批量處理所有查詢(使用IN子句)以克服IN子句(See here)上數據庫的限制。JPA 2.0:使用IN子句批量查詢

我通常會得到大小爲100000到305000的列表。所以,這對於解決這個問題變得非常重要。

到目前爲止,我已經嘗試了兩種策略。

策略1:

  • 創建一個實體,並且因此與一個列中的表來保存這樣的值(能與JPA動態創建的臨時表2.0與供應商無關?),並使用在最終清理臨時表之前,將臨時表中的數據作爲子查詢添加到原始查詢中。

  • 優點:非常高效的查詢。真的很快,我必須承認我提到的數字,大部分時間都在一分鐘之內。

  • 可能的缺點:使用臨時表,這對我而言實際上是永久性的。

策略2:

  • 計算批量大小爲給定的輸入列表和每個批次執行查詢,並累積的結果。

  • 優點:沒有臨時表。易於在同一事務中的任何線程。

  • 缺點:一個很大的缺點是執行所有批處理所花費的時間。對於上述數字,目前這個數字處於不可接受的水平。需要5至15分鐘之間的任何東西!

我很感謝來自JPA大師的任何反饋,建議或改進。

謝謝。

回答

1

我只測試多達50,000個整數,但我身邊有使用各種方法,使用CLR將大型列出了一些相當不錯的性能數據和數字表領導包在較高端:

http://sqlblog.com/blogs/aaron_bertrand/archive/2010/07/07/splitting-a-list-of-integers-another-roundup.aspx

不確定您是否使用整數或字符串,但結果應該大致相同。另外,我會承認我不知道JPA 2.0是什麼,但我認爲你可以控制它發送到SQL Server的列表的格式。

+0

非常感謝張貼亞倫。你的解決方案看起來不錯我需要將純SQL的東西翻譯成它的JPA等價物:) – JProgrammer 2012-02-21 21:26:39