gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:02:39 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com