hibernate - 哪个在 hibernate native 查询或 HQL 中的性能更好

标签 hibernate

在服务器端代码中,通常为了更好的性能,我们不应该使用“select * from table”,而是应该根据需要查询必要的列(选择名称,从员工添加)。这是我在数据库性能指南文章中读到的。

现在我对 hibernate 有疑问,我读到最好在 hibernate 中使用 session.load(id) 来检索基于主键的记录。这将检索与给定“id”(表中的记录)的实体关联的所有列。

现在它是否与通用数据库性能指南相矛盾。使用 hibernate native sql 查询或 hibernate 查询语言哪个性能更好?

让我知道您的宝贵意见,因为我正在尝试调整我的代码以获得更好的性能。

最佳答案

你搞砸了一些部分。您也可以使用 HQL 仅选择某些列,例如您可以使用 select column from table在 HQL 中。

native SQL 不一定比 HQL 快。 HQL 最终也被翻译成 SQL(您可以在运行应用程序时看到生成的语句,并将 show_sql 属性设置为 true)。在某些情况下,它可能会发生 Hibernate 不会生成最有效的语句,因此原生 SQL 可以更快 - 但是使用原生 SQL,您的应用程序会失去从一个数据库到另一个数据库的可移植性,因此通常最好调整 hibernate 映射和 HQL语句以生成更高效的 SQL 语句。另一方面,使用 native SQL,您缺少 Hibernate 缓存 - 因此在某些情况下 native SQL 可能比 HQL 慢。

当您使用 session.load(class, id)并且该行尚未在缓存中,加载也会生成 select * from classTable ,所以速度与 HQL 相同 from . (但是当对象已经在缓存中时,load 可能更快。)

我不同意您的性能指南:在大多数情况下,对于性能而言,加载所有列还是仅加载所需的列都无关紧要。在数据库访问中搜索行时会丢失时间,并且不是 将数据传输到您的应用程序时。当你只阅读必要的列时,它有以下缺点:

  • 当您需要尚未加载的列时,您在更改应用程序时会遇到更多麻烦(或者您必须再次加载该行,这意味着性能不佳)。
  • 它为您的应用程序提供了一个糟糕的设计(Hibernate 更喜欢一个表 - 一个类)
  • 它不适用于 Hibernate 缓存。

  • (认为​​,如果您的应用程序中存在您永远不需要的列,或者您的应用程序完成后将添加的列,那么您只是不要将它们放入您的类和您的映射中,它们永远不会被加载,并且您的应用程序设计仍然很好。Hibernate 不会生成 select * from table 语句,它总是生成 select col1, col2, ... from table 。)

    有一个异常(exception):如果您加载大量数据(数千行),那么仅加载必要的列会明显更快。

    关于hibernate - 哪个在 hibernate native 查询或 HQL 中的性能更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12187358/

    相关文章:

    Hibernate @DiscriminatorColumn 和 @DiscriminatorValue 问题

    hibernate - Grails/GORM:在Object.get查询中保留所有 transient 变量吗?

    java - Spring hibernate模板列表作为参数

    java - hibernate 对象没有被缓存

    java - 如何在 JPQL 中对同一个表使用两次连接?

    mysql - 连接 JPA Hibernate MySQL 的预期路径

    java - java 调用中的过程调用不起作用

    java - 以编程方式添加实体时出现 MappingNotFound 异常

    hibernate - 单个实体中的多个@id 注释

    mysql - 尝试保存用户时,列 'role_id' 不能为空。 Spring , hibernate ,SQL