在服务器端代码中,为了更好的性能,我们不应该使用“select * from table”,而应该根据需要查询必要的列(选择名称,从员工中添加)。
现在我对hibernate有疑问,我读到它更好地使用session.load(id)在hibernate中根据主键检索记录。这将检索与给定“id”(表中的记录)的实体相关联的所有列。
现在,它不矛盾的一般数据库性能准则。Hibernate Native SQL Query和Hibernate Query哪个更好?
让我知道你的宝贵投入,因为我试图调整我的代码,以获得更好的性能。
3条答案
按热度按时间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
,因此速度与HQLfrom
相同。(但是当对象已经在该高速缓存中时,load
可能更快。)我不同意你的业绩准则:在大多数情况下,如果你加载所有列或只加载需要的列,这与性能无关。在数据库访问中,时间在搜索行时丢失,而在将数据传输到应用程序中时不会丢失。当您只读取必要的列时,它有以下缺点:
(我想,如果有些列在应用程序中是永远不需要的,或者有些列是在应用程序完成后才添加的,那么你就不要把它们放到你的类和Map中,它们永远不会被加载,你的应用程序设计仍然是好的。Hibernate不生成
select * from table
语句,它总是生成select col1, col2, ... from table
。有一个例外:如果加载大量数据(数千行),那么只加载必要的列会快得多。
o2rvlv0m2#
实体查询(例如JPQL、HQL、Criteria API)再次呈现回SQL查询,因此很明显,运行原生SQL查询将比运行实体查询更快。
但是,如果您正确设置查询计划缓存大小,那么您可以加快实体查询的速度,使其与SQL查询一样快。
但是,如果您希望从脏检查机制中受益,并从修改后的实体中自动发出UPDATE,那么实体查询会更方便。只要实体查询和SQL查询之间的时间差是微不足道的(这通常是如果您使用数据库索引并且实体查询呈现非常有效的SQL查询),就没有什么可担心的。
j2cgzkjk3#
jpql and hql.与原生SQL略有不同,我强烈建议直接使用SQL,这些语言中的任何一种都会在最后被翻译成SQL,AKA SQL更快,不要让事情变得复杂+你会在任何地方使用SQL语法!