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

时间:2014-01-20 12:15:33

标签: java hibernate select sql-update

我开始在我的APP中使用这2个休眠注释。

@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 个答案:

答案 0 :(得分:9)

情况取决于您的情况。如果你的表非常简单(没有外键约束,只有几列,几个索引),那么更新完整记录会更快。

但是,如果您的表具有许多外键约束和索引,则首先选择然后更新差异会更快。这是因为PostgreSQL必须为更新中的每一列执行以下工作:

  • 检查外键约束
  • 更新相关索引

此外,更改会增加表格的膨胀,必须通过真空清理。

请记住,如果在包含许多表的数据库上使用dynamicUpdate,并且您的更新看起来非常不同,那么您将开始逐出缓存的查询计划。这些计划耗费资源来计算新鲜度。但是,缓存计划可能只对同一会话中的后续查询有用。