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

Я начинаю использовать эти две аннотации спящего режима в моем APP.

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

сначала я попытаюсь объяснить, что я понимаю об этом, чтобы узнать, прав ли я в этом.

@DynamicUpdate(value=true)

обновляет только modified values в сущности Hibernate needs to track those changes

@SelectBeforeUpdate(value=true)

создает select до update, чтобы узнать, какие свойства были изменены, это полезно, когда объект загружен и обновлен на разных сеансах Hibernate is out of tracking entity changes

Правильно ли это 2 утверждения?

Мое главное беспокойство.

в DB performance, который лучше или быстрее обновляет все поля в объекте сразу или generate a select to know which columns update and update only the modified columns?

Ответ 1

Ситуация зависит от ваших обстоятельств. Если ваша таблица очень проста (не имеет ограничений внешнего ключа, всего несколько столбцов, несколько индексов), то обновление полной записи будет быстрее.

Если, однако, ваша таблица имеет множество ограничений и индексов внешнего ключа, будет быстрее сначала выбрать, а затем обновить различия. Это связано с тем, что PostgreSQL должен выполнять следующую работу для каждого столбца в обновлении:

  • Проверить ограничение внешних ключей
  • Обновить связанные индексы

Кроме того, изменения добавляют раздувание к таблицам, которые необходимо очистить вакуумом.

Имейте в виду, что если вы используете dynamicUpdate в базе данных со многими таблицами, а ваши обновления выглядят совсем по-другому, вы начнете выходить из кэшированных планов запросов. Эти планы стоят ресурсов для расчета свежих. Хотя, кэшированные планы могут быть полезны только для последующих запросов в том же сеансе.