Hibernate 标准v/s HQL。谁更快?

Hibernate 标准v/s HQL。谁更快?,hibernate,Hibernate,我一直在读一些答案,但我还是很困惑。为什么?因为你提到的差异与绩效无关。它们与易用性相关(Objetc(标准)和SQL(hql))。但我想知道“标准”是否因为某种原因比hql慢 我在另一本书上读到了这个 “HQL和criteriaQuery在性能方面存在差异,每次使用criteriaQuery启动查询时,都会为表名创建一个新的别名,该别名不会反映在任何数据库的上次查询缓存中。这会导致编译生成的SQL的开销,需要更多的时间执行。”Varun Mehta说 这是非常接近,但!我在另一个网站上读到(h

我一直在读一些答案,但我还是很困惑。为什么?因为你提到的差异与绩效无关。它们与易用性相关(Objetc(标准)和SQL(hql))。但我想知道“标准”是否因为某种原因比hql慢

我在另一本书上读到了这个

“HQL和criteriaQuery在性能方面存在差异,每次使用criteriaQuery启动查询时,都会为表名创建一个新的别名,该别名不会反映在任何数据库的上次查询缓存中。这会导致编译生成的SQL的开销,需要更多的时间执行。”Varun Mehta说

这是非常接近,但!我在另一个网站上读到(http://gary-rowe.com/agilestack/tag/hibernate/)Hibernate 3.3及以上版本不再如此(请阅读:9)Hibernate速度较慢,因为Criteria接口生成的SQL不一致)

我做了一些测试,试图找出差异,但两者都会生成qry,并且不会更改表的别名


我很困惑。如果有人知道主要原因,你能帮助我们吗。总之,感谢您,如果您使用HQL或条件创建最终SQL,您将不会在Hibernate的更高版本(3.3版及更高版本)中看到性能上的太大差异

要测试这一点,您需要在HQL和Criteria接口中创建一个代表性查询。然后记录从Hibernate的较旧版本中得到的SQL(可能使用Maven来允许快速的版本更改)。您将注意到,随着Hibernate版本的减少,您将看到最终SQL中的更改

尝试在HQL和代码中的条件之间进行优化没有什么意义,因为绝大多数时间损失将在应用程序和数据库之间的网络流量中。当然,这假设您有一个格式良好的查询,不需要对一亿行或其他行进行多次完整表扫描

因此,请注意不要断章取义(强调我的):

9)“Hibernate很慢,因为SQL 由条件界面生成的是 不一致“

据说 Hibernate也会导致性能下降 如果构造了所有查询,则单击 而是通过标准接口 直接在HQL中使用。争论 假设这是因为每次 执行查询生成器代码, 在DAO中,Hibernate将生成 中的表的新别名 查询在甲骨文中,这意味着 创建新的基于条件的查询的时间 运行时,数据库必须创建QEP—— 查询执行计划–因为它无法 以匹配它所提供给的SQL 在它的缓存中。创建QEP可以 花30%的时间完成 Oracle将响应SQL语句, 因此,第二次和随后的 执行相同的操作(但针对别名) 名称)SQL语句,条件具有 内置的管理费用使其达到50% 比直接HQL慢

现在的情况已经不是这样了 Hibernate 3.3及以上版本<如果是的话 从那以后,是否真的存在就成了疑问 Hibernate团队的目标肯定是 尽可能创建最佳SQL。 独立测试表明 相同的查询由 重复后的标准界面 调用跨越事务的 相当于运行 负载下的应用程序。在每种情况下 该查询保持不变,并被删除 因此能够被Oracle缓存

不过,有一点是事实, 因此,有必要创建 每次使用条件进行查询 接口,而使用命名查询 HQL中定义的允许 应用程序期间的预编译 启动。然而,这需要一些技巧 观点。创建所需的时间 使用 标准接口约为 平均每台电脑3毫秒。嵌入HQL 内部应用程序不是一个好的解决方案 替代方案,因为它不会导致 一种直观的维护机制 具有不同抓取的查询 战略等标准为基础 这种方法被认为是最好的 两个

因此,博客本质上指出,主要区别在于Criteria接口可能会引入几毫秒的额外处理开销,这可以通过直接HQL方法避免。HQL的查询表达式也更加简洁,许多人会觉得它很吸引人

简言之,差别如此之小,你不必担心