哪个在hibernate本机查询或HQL中表现更好

man*_*j s 11 hibernate

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

现在我有hibernate的问题,我读到最好在hibernate中使用session.load(id)来根据主键检索记录.这将检索与给定"id"(表中的记录)的实体关联的所有列.

现在它与一般数据库性能指标并不矛盾.哪个是hibernate本机sql查询或hibernate查询语言更好的性能?

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

Joh*_*nna 35

你弄乱了一些零件.您也可以仅使用HQL选择某些列,例如,您可以select column from table在HQL中使用.

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

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

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

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

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

有一个例外:如果加载大量数据 - 数千行 - 那么只加载必要的列可以明显加快.