web-dev-qa-db-ja.com

Hibernate @DynamicUpdate(value = true)@SelectBeforeUpdate(value = true)パフォーマンス

aPPでこの2つの休止状態のアノテーションを使い始めています。

@DynamicUpdate(value=true)
@SelectBeforeUpdate(value=true) 

最初に、私がそれについて理解していることを説明して、私がそれについて正しいかどうかを知るようにします。

@DynamicUpdate(value=true)

エンティティmodified valuesHibernate needs to track those changesのみを更新します

@SelectBeforeUpdate(value=true)

selectの前にupdateを作成して、変更されたプロパティを確認します。これは、エンティティがさまざまなセッションでロードおよび更新された場合に役立ちますHibernate is out of tracking entity changes

この2つの断言は正しいですか?

私の主な関心事はです。

in DB performanceどちらが良いか速いかエンティティ内のすべてのフィールドを一度に更新しますまたはgenerate a select to know which columns update and update only the modified columns?

13
chiperortiz

状況はあなたの状況に依存します。テーブルが非常に単純な場合(外部キーの制約がなく、列が少なく、インデックスが少ない)、レコード全体の更新が高速になります。

ただし、テーブルに多くの外部キー制約とインデックスがある場合は、最初に違いを選択してから更新する方が高速です。これは、PostgreSQLがアップデートの各列に対して次の作業を行う必要があるためです。

  • 外部キー制約を確認する
  • 関連するインデックスを更新する

さらに、変更によりテーブルが肥大化し、バキュームでクリーンアップする必要があります。

多くのテーブルがあるデータベースでdynamicUpdateを使用し、更新の外観が大きく異なる場合は、キャッシュされたクエリプランの削除を開始することに注意してください。これらの計画は、新たに計算するためのリソースを要します。ただし、キャッシュされたプランは、とにかく同じセッションでの後続のクエリにのみ役立つ可能性があります。

9
Chris Betti