小编use*_*212的帖子

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

我正在使用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以提高性能吗?

hibernate jpa union-subclass

5
推荐指数
1
解决办法
862
查看次数

标签 统计

hibernate ×1

jpa ×1

union-subclass ×1