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