2012-02-21 21 views
1

IN句(See here)のデータベースによる制限を克服するために、すべてのクエリ(IN句付き)をバッチする戦略を探しています。JPA 2.0:IN句を使用したクエリのバッチ

私は通常、サイズが100000から305000のリストを取得しています。これは、取り組むことが非常に重要になっています。

これまで2つの戦略を試しました。

戦略1:

  • エンティティひいては(我々が2.0ベンダーに依存JPAとその場で一時テーブルを作成することができますか?)、そのような値を保持する一つのカラムを持つテーブルを作成し、使用最終的に一時テーブルをクリーンアップする前に、元のクエリへのサブクエリとして一時テーブルからのデータ。

  • 利点:パフォーマンスの高いクエリ。本当に早く、私が言及した数字を認めなければならない。それはほとんどが1分以内だった。

  • 考えられる欠点:これまでの私の場合、実際には永久的な一時テーブルの使用。

戦略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

Aaronを投稿してくれてありがとうございました。あなたの解決策はよく見えます。純粋なSQLのものをJPAの同等のものに変換する必要があります:) – JProgrammer

関連する問題