如何克服Hibernate中生成的union-subclass SQL引起的性能问题

use*_*212 5 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
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在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
Run Code Online (Sandbox Code Playgroud)

也可以在限制上进行一些优化.我在DAO层使用Hibernate标准API.

无法使用Interceptor,onPrepareStatment(),因为参数不可见.在数据库中使用分区和可能的其他选项目前不在范围内,因为我们希望在此阶段的工作中避免DB特定的优化.

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

小智 0

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

请注意,如果您的类层次结构中有两个以上级别,则可以将 table-pr-class 与判别器列组合起来。