hibernate - 如何克服Hibernate中union-subclass生成SQL导致的性能问题

标签 hibernate jpa union-subclass

我正在使用 Hibernate 支持 TABLE_PER_CLASS 继承策略。功能明智它运作良好。每当发出多态查询时,Hibernate 都会为我的两个具体类 A 和 B 生成一个包含“union all”的 SQL。生成的 SQL 具有以下格式:

select C1, C2, C3 from (
    select C1, C2, C3 from ClassA
  union all
    select C1, C2, C3 from ClassB
)
where 
    C1 == <value>
order by C2
limit 100

这种方法的问题在于 DB 端的性能非常差。考虑到 C1 列是 ClassA 和 ClassB(派生自抽象父级)的共享属性,Hibernate 可以在两个子选择中插入 where 子句并显着提高性能。例如,
select C1, C2, C3 from ( 
    select C1, C2, C3 from ClassA where C1 == <value>
    union all
    select C1, C2, C3 from ClassB where C1 == <value>
)
order by C2
limit 100

也可以在极限上做一些优化。
我在我的 DAO 层中使用 Hibernate 标准 API。

由于参数不可见,因此无法使用拦截器 onPrepareStatment()。
在 DB 上使用分区和可能的其他选项目前超出了范围,因为我们希望在工作的这个阶段避免特定于 DB 的优化。

知道如何操纵 hibernate 来提高性能吗?

最佳答案

我想要高跨数据库性能,而不是我建议不要使用 table-pr-class 和许多或巨大的多态查询。鉴别器列通常会更好。

请注意,如果您的类层次结构中有两个以上的级别,则可以将 table-pr-class 与 discrimantor-columns 结合使用。

关于hibernate - 如何克服Hibernate中union-subclass生成SQL导致的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10572408/

相关文章:

java - 有没有办法动态生成 Spring Data Jpa 查询?

c# - 为什么 NHibernate 不能在每个具体类映射的联合子类表中使用标识?

java - C3P0 + Hibernate ClassNotFoundException : com. mchange.v2.log.MLog

nhibernate - 如何使用 NHibernate 联合子类映射抽象属性?

java - spring 在频繁刷新/ajax 调用后卡住

java - 在 Hibernate 中映射 Map<String,List<Foo>>

hibernate - 如何避免 "N+1 Select"并为具有多对一的 (N)Hibernate 用户类型指定获取策略?

java - 持久化之前如何获取实体的ID?

java - Java 中的 Lambda - 无法分析 lambda 代码