Hibernate原生查询和HQL哪个性能更好

1aaf6o9v  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(138)

在服务器端代码中,为了更好的性能,我们不应该使用“select * from table”,而应该根据需要查询必要的列(选择名称,从员工中添加)。
现在我对hibernate有疑问,我读到它更好地使用session.load(id)在hibernate中根据主键检索记录。这将检索与给定“id”(表中的记录)的实体相关联的所有列。
现在,它不矛盾的一般数据库性能准则。Hibernate Native SQL Query和Hibernate Query哪个更好?
让我知道你的宝贵投入,因为我试图调整我的代码,以获得更好的性能。

ggazkfy8

ggazkfy81#

你把某些部分弄乱了您也可以使用HQL仅选择某些列,例如您可以在HQL中使用select column from table
原生SQL不一定比HQL快。HQL最后也被转换成SQL(当运行show_sql属性设置为true的应用程序时,您可以看到生成的语句)。在某些情况下,可能会发生Hibernate不能生成最有效的语句,因此原生SQL可以更快-但使用原生SQL,您的应用程序将失去从一个数据库到另一个数据库的可移植性,因此通常最好调整HibernateMap和HQL语句以生成更有效的SQL语句。另一方面,使用原生SQL时,您会丢失Hibernate缓存-因此在某些情况下,原生SQL可能比HQL慢。
当您使用session.load(class, id)并且该行还不在该高速缓存中时,加载也会生成select * from classTable,因此速度与HQL from相同。(但是当对象已经在该高速缓存中时,load可能更快。)
我不同意你的业绩准则:在大多数情况下,如果你加载所有列或只加载需要的列,这与性能无关。在数据库访问中,时间在搜索行时丢失,而在将数据传输到应用程序中时不会丢失。当您只读取必要的列时,它有以下缺点:

  • 当您需要尚未加载的列时,更改应用程序会遇到更多麻烦(或者您必须再次加载行,这意味着性能很差)。
  • 它给你的应用程序一个糟糕的设计(Hibernate更喜欢一个表-一个类)
  • 它不能很好地与Hibernate缓存一起工作。

(我想,如果有些列在应用程序中是永远不需要的,或者有些列是在应用程序完成后才添加的,那么你就不要把它们放到你的类和Map中,它们永远不会被加载,你的应用程序设计仍然是好的。Hibernate不生成select * from table语句,它总是生成select col1, col2, ... from table
有一个例外:如果加载大量数据(数千行),那么只加载必要的列会快得多。

o2rvlv0m

o2rvlv0m2#

实体查询(例如JPQL、HQL、Criteria API)再次呈现回SQL查询,因此很明显,运行原生SQL查询将比运行实体查询更快。
但是,如果您正确设置查询计划缓存大小,那么您可以加快实体查询的速度,使其与SQL查询一样快。
但是,如果您希望从脏检查机制中受益,并从修改后的实体中自动发出UPDATE,那么实体查询会更方便。只要实体查询和SQL查询之间的时间差是微不足道的(这通常是如果您使用数据库索引并且实体查询呈现非常有效的SQL查询),就没有什么可担心的。

j2cgzkjk

j2cgzkjk3#

jpql and hql.与原生SQL略有不同,我强烈建议直接使用SQL,这些语言中的任何一种都会在最后被翻译成SQL,AKA SQL更快,不要让事情变得复杂+你会在任何地方使用SQL语法!

相关问题