Hibernate ORM 版本 6.2.0.Final
即将发布,以下文章将介绍该版本中的一些新特性。
表分区
在数据管理中,有时需要根据分区键和分区方案将表的(物理)数据分割成多个分区。
每个数据库都有自己的方式来定义表的分区键和方案,但它们共同点是查询规划器需要决定查询应该查看哪个分区。除非数据库支持分区表的全局唯一索引,否则查询规划器不知道应该针对哪个分区,因此必须计划访问每个分区。这导致在支持分区但不支持全局唯一索引的流行开源数据库 PostgreSQL 和 MySQL/MariaDB 上查询规划性能不佳。
分区键映射
在关于如何在 Hibernate 中支持这一功能的讨论之后,我们首先采取了一种最小化方法,以确保我们可以尽快帮助人们提高性能。
最小化方法是允许通过使用 @PartitionKey
注解标记持久化属性作为分区键的一部分。这会使得 Hibernate 在刷新实体状态变化时发出的 SQL 更新和删除语句,将额外限制 WHERE
子句中的分区键列。
考虑以下实体模型
@Entity
@Table(name = "user_tbl")
public static class User {
@Id
private Long id;
private String firstname;
private String lastname;
@PartitionKey
private String tenantKey;
}
当更新或删除此类实体时,Hibernate 现在将生成类似的 SQL
update user_tbl set firstname=?,lastname=?,tenantKey=? where id=? and tenantKey=?
delete from user_tbl where id=? and tenantKey=?
WHERE
子句中的限制允许规划器查看参数值,并立即排除不符合分区键的表。
展望
迄今为止,Hibernate 只在 SQL 更新和删除语句中使用了分区信息。关于增加对 DDL 生成 的支持也进行了讨论,但尚未达成一致意见。
你认为您能从 DDL 支持中受益吗?如果是的话,请在我们的 GitHub 讨论区 的评论中告诉我们您的用例。