在服务器端代码中,通常为了更好的性能,我们不应该使用“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 不会生成
select * from table
语句,它总是生成 select col1, col2, ... from table
。)有一个异常(exception):如果您加载大量数据(数千行),那么仅加载必要的列会明显更快。
关于hibernate - 哪个在 hibernate native 查询或 HQL 中的性能更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12187358/