【问题标题】:Hibernate inheritance performanceHibernate继承性能
【发布时间】:2012-06-27 15:58:33
【问题描述】:

我正在使用带有 MySQL 数据库的 Hibernate 3(我尝试使用 Hibernate 4,但没有更多成功)。我已经实现了一个 table-per-concrete-class 继承策略(联合子类)。

它完成了除了多态查询之外的工作。 Hibernate 生成一个基于 UNION 的查询,其中“where”子句位于高级查询中:

select primKey, param1, param2 from (
    select primKey, param1, param2 from Concrete1
    union
    select primKey, param1, param2 from Concrete2
)
where primKey == <value>
order by param1
limit 100

这会导致加载整个具体表内容时性能非常差,而因为 pkey 是抽象父级的属性,所以可以在子选择中定义“where”子句。

所以目标是让 Hibernate 生成这种查询:

select primKey, param1, param2 from (
    select primKey, param1, param2 from Concrete1 where primKey == <value>
    union
    select primKey, param1, param2 from Concrete2 where primKey == <value>
)
order by param1
limit 100

这样,查询会立即执行。

知道如何配置 Hibernate 来改变这种行为吗?

谢谢

是的。

【问题讨论】:

  • 不确定休眠但为什么不使用存储过程,假设输入参数 primKey 和 limit;甚至是一个视图(优化视图 - 索引等)——该视图将包含联合 Croncrete1 和 Concrete2 表,并将从 mView 中选择 [cols] where primKey = value order by [cols] limit ?,?.

标签: mysql performance hibernate inheritance union-subclass


【解决方案1】:

我曾经遇到过类似的性能问题,但发现唯一的解决方案是(至少在当时)将实现切换到 "Table per class hierarchy",因为它不需要联合或连接,所以性能要好得多。它没有那么简洁的架构,但如果你只有几个子类可能是不错的选择。

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2017-12-07
    • 2013-12-10
    • 2011-11-22
    • 2010-11-25
    相关资源
    最近更新 更多