当前位置: 首页 > 知识库问答 >
问题:

在hibernate原生查询或HQL中哪个性能更好

孟栋
2023-03-14

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

现在我用hibernate做了一个查询,我读到在hibernate中最好使用session.load(id)来根据主键检索记录。这将检索与给定“id”(表中的记录)的实体关联的所有列。

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

让我知道你的宝贵意见,因为我试图调整我的代码,以更好的性能。

共有2个答案

柴浩大
2023-03-14

实体查询(例如JPQL、HQL、Criteria API)再次呈现回SQL查询,因此很明显,运行本机SQL查询将比运行实体查询更快。

但是,如果将查询计划缓存大小设置正确,则可以加快实体查询的速度,使其与SQL查询一样快。

但是如果您想从脏检查机制中受益并从修改后的实体中自动发出UPDATE,那么实体查询要方便得多。只要实体查询和SQL查询之间的时间差微不足道(通常是在您使用数据库索引并且实体查询呈现非常有效的SQL查询的情况下),就没什么好担心的。

汪典
2023-03-14

您弄乱了某些部分。您也可以使用HQL只选择某些列,例如,您可以在HQL中使用从表中选择列。

本机SQL不一定比HQL快。HQL最终也被转换为SQL(当运行应用程序时,将show\u SQL属性设置为true时,可以看到生成的语句)。在某些情况下,Hibernate可能无法生成最高效的语句,因此本机SQL可以更快-但使用本机SQL,应用程序将失去从一个数据库到另一个数据库的可移植性,因此通常最好调整Hibernate映射和HQL语句以生成更高效的SQL语句。另一方面,对于本机SQL,您缺少Hibernate缓存——因此在某些情况下,本机SQL可能比HQL慢。

当您使用会话时。load(class,id)并且该行尚未在缓存中,该load还从类表生成一个select*,因此速度与来自的HQL相同。(但当对象已经在缓存中时,加载可能会更快。)

我不同意您的性能准则:在大多数情况下,如果您加载所有列或仅加载所需的列,那么对于性能而言,这是无关紧要的。在数据库访问中,搜索行时会损失时间,而在将数据传输到应用程序时则不会。当您只读取必要的列时,它有以下缺点:

  • 当您需要尚未加载的列时,您在更改应用程序时会遇到更多麻烦(或者您必须再次加载该行,这意味着性能较差)

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

有一个例外:如果您加载大量数据——数千行——那么仅加载必要的列可以显着加快。

 类似资料:
  • 问题内容: 我有以下hibernate映射: 而表如下所示: 我的hibernate查询看起来像: 但是我总是 有人可以帮我如何使它正常工作吗? 问题答案: 您必须使用子查询而不是联接。大致如下: 另外,根据类型的不同,应该以其他格式显示它。

  • 问题内容: 我有一张叫订单的桌子。订单上的一列是customer_id, 我有一个名为“ customers”的表,具有10个字段 给定两个选项,如果我要建立一个订单对象数组并将其嵌入到一个客户对象中,那么我有两个选择。 选项1: 一种。首先查询订单表。b。遍历记录并查询人员表以获取人员的记录 这将是这样的: 选项2: 一种。在所有领域参加 #2是显而易见的,因为您只执行一个查询,而不是1 + [

  • 问题内容: 我想在hibernateHql的同一查询中执行多个更新语句。如下所示: 在同一调用中,我想更新表1中的记录并从表2中删除记录。 那可能吗? 问题答案: 简而言之,您所看到的就像是JDBC中的批处理。Hichnate没有为批量更新查询提供Thich,并且我怀疑是否会为Hibernate考虑它。 根据我过去的经验,HQL的批处理功能在现实生活中很少有用。在SQL + JDBC中有用但在HQ

  • 1. 前言 本节课程和大家一起学习 Hibernate 中的 HQL ( Hibernate 查询语言)。通过本节课程的学习,你将了解到: HQL 基础语法; HQL 查询的具体实现。- 2. HQL 查询?前面不是讲过?用过吗? 但是,前面的查询都是简单查询,真实项目中的查询需求要远比这个复杂。仅仅依靠 get()、load() 是远远达不到要求。 Hibernate 提供了灵活多样的查询机制,

  • 问题内容: 可以说我有一个具有两列和String数据类型的表。通常我写我的hql查询像 我可以编写将两个属性都连接在一起的hql查询吗? 也许像 问题答案: 或者,如果您想要分隔符: 请参阅文档。

  • 问题内容: 要在数据库中搜索在任何列“ foo_desc”和“ bar_desc”中同时具有关键字“ foo”和“ bar”的行,我将执行以下操作: 要么 我希望最后一个查询的缺点是性能。 好的一面是,LIKE查询找到了“ MATGA AGAINST”找不到的“ xxfoo”。 哪一个是首选,还是有更好的解决方案? 问题答案: 更新资料 从表开始,表支持。 第一个 要 好得多。在 MyISAM 表