11.8. パフォーマンスチューニング


11.8.1. 代替のバッチローディングアルゴリズム

Hibernate では、4 つのフェッチングストラテジー (join、select、subselect、および batch) のいずれかを使用してアソシエーションのデータをロードできます。batch ローディングは select フェッチングの最適化ストラテジーであるため、パフォーマンスを最大限に向上できます。このストラテジーでは、主キーまたは外部キーのリストを指定することで、Hibernate が単一の SELECT ステートメントでエンティティーインスタンスまたはコレクションのバッチを読み出します。batch フェッチングは、レイジー select フェッチングストラテジーの最適化です。
batch フェッチングを設定する方法には、クラスごとのレベルと、コレクションごとのレベルの 2 つの方法があります。
  • クラスごとのレベル
    Hibernate がクラスごとのレベルでデータをロードする場合、クエリー時に事前ロードするアソシエーションのバッチサイズが必要になります。たとえば、起動時に car オブジェクトの 30 個のインスタンスがセッションでロードされるとします。各 car オブジェクトは owner オブジェクトに属します。lazy ローディングで、すべての car オブジェクトを繰り返し、これらの owner (所有者) を要求する場合、Hibernate は owner ごとに 1 つ、合計 30 個の select ステートメントを発行します。これは、パフォーマンス上のボトルネックになります。
    この代わりに、クエリーによって要求される前に次の owner のバッチに対してデータを事前ロードするよう Hibernate を指示できます。owner オブジェクトがクエリーされると、Hibernate は同じ SELECT ステートメントでこれらのオブジェクトをさらに多くクエリーします。
    事前にクエリーされる owner オブジェクトの数は、設定時に指定された batch-size パラメーターによって異なります。
    <class name="owner" batch-size="10"></class>
    Copy to Clipboard Toggle word wrap
    これは、今後必要になると見込まれる最低 10 個の owner オブジェクトをクエリーするよう Hibernate に指示します。ユーザーが car Aowner をクエリーする時、car Bowner はすでにバッチローディングの一部としてロードされた可能性があります。実際に car Bowner が必要になった場合、データーベースにアクセスして SELECT ステートメントを発行する代わりに、現在のセッションより値を読み出すことができます。
    Hibernate 4.2.0 には、batch-size パラメーターの他に、バッチローディングのパフォーマンスを向上する新しい設定項目が追加されました。この設定項目は Batch Fetch Style 設定と呼ばれ、hibernate.batch_fetch_style パラメーターによって指定されます。
    LEGACY、PADDED、および DYNAMIC の 3 つのバッチフェッチスタイルがサポートされます。使用するスタイルを指定するには、org.hibernate.cfg.AvailableSettings#BATCH_FETCH_STYLE を使用します。
    • LEGACY: LEGACY スタイルのローディングでは、ArrayHelper.getBatchSizes(int) を基にする事前ビルドされたバッチサイズが使用されます。既存のバッチ可能な識別子の数より、次に小さい事前ビルドされたバッチサイズを使用してバッチがロードされます。
      前述の例を用いた場合、batch-size の設定が 30 であると、事前ビルドされたバッチサイズは [30, 15, 10, 9, 8, 7, .., 1] になります。29 個の識別子をバッチロードしようとすると、バッチは 15、10、および 4 になります。対応する 3 つの SQL クエリーが発生し、各クエリーはデータベースより 15、10、および 4 人の owner をロードします。
    • PADDED - PADDED は LEGACY スタイルのバッチローディングと似ています。PADDED も事前ビルドされたバッチサイズを使用しますが、次に大きなバッチサイズを使用し、余分な識別子プレースホルダーを埋め込みます。
      上記の例で、30 個の owner オブジェクトが初期化される場合は、データベースに対して 1 つのクエリーのみが実行されます。
      29 個の owner オブジェクトが初期化される場合、Hibernate は同様にバッチサイズが 30 の SQL select ステートメントを 1 つ実行しますが、余分なスペースが繰り替えされる識別子で埋め込みされます。
    • DYNAMIC - DYNAMIC スタイルのバッチローディングはバッチサイズの制限に準拠しますが、実際にロードされるオブジェクトの数を使用して SQL SELECT ステートメントを動的にビルドします。
      たとえば、30 個の owner オブジェクトで最大バッチサイズが 30 の場合、 30 個の owner オブジェクトの読み出しは 1 つの SQL SELECT ステートメントによって実行されます。35 個の owner オブジェクトの読み出す場合は、SQL ステートメントが 2 つになり、それぞれのバッチサイズが 30 と 5 になります。Hibernate は、制限どおりにバッチサイズを 30 以下とし、2 つ目の SQL ステートメントを動的に変更して、必要数である 5 にします。PADDED とは異なり、2 つ目の SQL は埋め込みされません。また、2 つ目の SQL ステートメントは動的に作成され、固定サイズでないことが LEGACY とは異なります。
      30 個未満のクエリーでは、このスタイルは要求された識別子の数のみを動的にロードします。
  • コレクションごとのレベル
    Hibernate は、前項の「クラスごとのレベル」で説明したバッチフェッチサイズとスタイルを維持してコレクションをバッチロードすることもできます。
    前項の例を逆にして、各 owner オブジェクトによって所有されるすべての car オブジェクトをロード必要があるとします。10 個の owner オブジェクトがすべての owner を繰り返し、現セッションにロードされた場合、getCars() メソッドの呼び出しごとに 1 つの SELECT ステートメントが生成されるため、合計で 10 個の SELECT ステートメントが生成されます。owner のマッピングでの car コレクションのバッチフェッチングを有効にすると、Hibernate は下記のようにこれらのコレクションを事前フェッチできます。
    <class name="Owner"><set name="cars" batch-size="5"></set></class>
    Copy to Clipboard Toggle word wrap
    よって、batch-size が 5 で LEGACY バッチスタイルを使用する場合、Hibernate は 2 つの SELECT ステートメントの 5 つのコレクションをロードします。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat