sql >> データベース >  >> RDS >> PostgreSQL

@BatchSizeは賢い使用ですか、それとも愚かな使用ですか?

    1. はい、@BatchSize 怠惰な関連付けで使用することを目的としています。
    2. Hibernateは、初期化されていないプロキシ/コレクションの数が指定されたバッチサイズより少ない場合でも、ほとんどの状況で複数のステートメントを実行します。詳細については、この回答を参照してください。また、小さいクエリと比較して軽いクエリは、システムの全体的なスループットにプラスの影響を与える可能性があります。
    3. @BatchSize クラスレベルでは、エンティティに指定されたバッチサイズがすべての@*ToOneに適用されることを意味します そのエンティティとの怠惰な関連付け。 Personの例を参照してください ドキュメント内のエンティティ。

    あなたが提供したリンクされた質問/回答は、一般的に最適化と遅延読み込みの必要性についてより懸念しています。もちろん、ここでも適用されますが、バッチロードのみに関連しているわけではありません。これは可能なアプローチの1つにすぎません。

    もう1つの重要なことは、リンクされた回答に記載されているイーガーローディングに関連しており、プロパティが常に使用されている場合は、イーガーローディングを使用することでパフォーマンスが向上する可能性があることを示唆しています。これは一般的に真実ではありません コレクションの場合、および多くの状況で1対1の関連付けの場合もあります。

    たとえば、bsのエンティティが次のようになっているとします。 およびcs 常に Aの場合に使用されます 使用されます。

    public class A {
      @OneToMany
      private Collection<B> bs;
    
      @OneToMany
      private Collection<C> cs;
    }
    

    bsを熱心に読み込んでいます およびcs 単一のクエリでそれらを結合しない場合、明らかにN+1選択の問題に悩まされます。ただし、たとえば次のように、それらを1つのクエリに結合する場合:

    select a from A
      left join fetch a.bs
      left join fetch a.cs
    

    次に、完全なデカルト積を作成します bsの間 およびcs count(a.bs) x count(a.cs)を返します 各aの結果セットの これらは1つずつ読み取られ、Aのエンティティにアセンブルされます。 およびそれらのbsのコレクション およびcs

    最初にAを読み取るため、この状況ではバッチフェッチが非常に最適です。 s、次にbs 次にcs 、結果としてクエリが増えますが、データベースから転送されるデータの総量ははるかに少なくなります。また、個別のクエリは、結合を使用する大きなクエリよりもはるかに単純であり、データベースの実行と最適化が容易です。




    1. Oracle連結文字列と数値の例

    2. Hyper-V内で動的メモリを使用する場合のリスク

    3. postgresデータベースに単一のテーブルのバックアップを作成するにはどうすればよいですか?

    4. Oracle:WHERE句で `(+)`は何をしますか?