タスクを実行するために大量のデータを取得する必要があるjavajpa/hibernateアプリがあります。n + 1の問題が発生したため、hibernate.default_batch_fetch_size(@batchsize)プロパティを使用して、必要なSQLラウンドトリップを減らすことにしました。いくつかの値を試しましたが、ほとんどすべての値でパフォーマンスが低下しました。
バッチサイズ:0-SQL送信:14000-期間:約1分
バッチサイズ:4-SQL送信:5000-期間:10分以上
バッチサイズ:10-SQL送信:2700-期間:約5分
バッチサイズ:100-SQL送信:400-期間:約1分
これは「通常の」動作ですか?そうでない場合、何が間違いである可能性がありますか?
生成されたSQLをlog4jdbcでログに記録しました。私は、バッチ処理されたすべてのステートメントの間に約100〜150ミル秒あることに気づきました。後でSQLを実行すると、各ステートメントの実行時間は20ミリ秒以下でした。したがって、これはDB(INステートメント)関連の問題ではありません。
Java:1.6.0_31、Hibernate 3.6.7、DB Postgres 9.1.1、JDBC postgresql-9.1-901.jdbc4.jar
前もって感謝します
明確にするための更新:パフォーマンスの低下は、バッチ更新/挿入ではなく、バッチフェッチ中です。