JPA 鉴别器类型性能

Posted

技术标签:

【中文标题】JPA 鉴别器类型性能【英文标题】:JPA Discriminator Types Performance 【发布时间】:2015-10-04 08:54:18 【问题描述】:

我对整数和字符串鉴别器类型之间的性能差异有疑问。 我正在使用 Joined 策略,即:

@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class SuperClass

我有一些子类正在扩展这个超类。 哪个性能更好? DiscriminatorType.INTEGERDiscriminatorType.STRING?

我们的提供商是 eclipselink,我们正在处理大量数据。

提前致谢。

【问题讨论】:

“大规模”到底是什么意思。 性能取决于数据库类型、索引类型、索引大小。也许这篇文章会对你有所帮助:https://weblogs.java.net/blog/caroljmcdonald/archive/2009/08/28/jpa-performance-dont-ignore-database-0。无论如何,尝试使用 String 和 Integer 两种类型运行基准测试。 谢谢安德烈。我做了一个基准测试,没有发现任何重大差异。当然这是一个测试环境,当然在生产环境中条件会有所不同。据我了解,eclipselink 将生成查询,其中它将鉴别器列与鉴别器值进行比较。所以唯一的性能问题是通过数字或字符串进行比较。在 Oracle 和索引中,我认为没有什么大的区别。是吗? 【参考方案1】:

通常使用整数字段作为主键列或索引列或连接会执行得更好,如果这就是您所要求的。

但是如果你真的要处理大量数据,如果扩展类上没有很多不同的属性,你可以考虑使用 SINGLE_TABLE 而不是 JOINED 类型继承。

因为使用 JOINED 类型继承,每次需要数据时都需要执行额外的连接操作。而且你应该为每次插入做 2 次插入。

【讨论】:

以上是关于JPA 鉴别器类型性能的主要内容,如果未能解决你的问题,请参考以下文章

JPA:继承 - 生成的 SQL 中未考虑鉴别器值

通过Azure 存储账号URL鉴别是标准磁盘还是高性能磁盘

Java /JPA |具有指定继承类型的查询

未知的鉴别器值“SqlException”,如何忽略动态类型的鉴别器

将名为 EMPLOYEE 的枚举映射到 VARCHAR 鉴别器值“M”

尝试访问 NHibernate 中的类型鉴别器字段