我一直在读一些回答,但我仍然感到困惑。为什么?因为你提到的差异与绩效无关。它们与易用性有关。(Objetc(标准)和SQL(hql))。但我想知道“条件”是否因某种原因比hql慢。
我在另一个回答中读到了这个
“HQL和criteriaQuery之间的性能存在差异,每次使用criteriaQuery触发查询时,它都会为表名创建一个新别名,该别名不会反映在任何数据库的最后一个查询缓存中。这会导致编译生成的SQL的开销,花费更多的时间来执行。“作者:Varun Mehta。
这非常接近但是很接近!我在另一个网站上阅读(http://gary-rowe.com/agilestack/tag/hibernate/)Hibernate 3.3及以上版本不再是这种情况(请阅读:9)Hibernate很慢,因为SQL生成的Criteria接口不一致)
我已经做了一些测试,试图找出差异,但两者都生成qry,并且它不会更改表的别名。
我很困惑。如果有人知道主要原因,请帮助我们。感谢
答案 0 :(得分:7)
总的来说,如果您使用HQL或Criteria来创建最终的SQL,那么在后续版本的Hibernate(版本3.3及更高版本)中,性能将不会有太大差异。
要对此进行测试,您需要在HQL和Criteria界面中创建代表性查询。然后从逐步旧版本的Hibernate中记录生成的SQL(可能使用Maven来允许快速版本更改)。您会注意到,随着Hibernate版本的减少,您将看到最终SQL中的更改。
尝试在代码中优化HQL和Criteria之间没有什么意义,因为绝大多数时间丢失将在应用程序和数据库之间的网络流量中。当然,这假设您有一个结构良好的查询,不需要超过一亿行或类似的多个全表扫描。
quoted blog is attempting to debunk myths所以要小心你不要把标题脱离背景(强调我的):
9)“因为SQL,Hibernate很慢 Criteria接口生成的是 不一致“
有人说过 Hibernate也可以带来性能 如果构造了所有查询,则命中 而是通过Criteria界面 直接在HQL中。争论 认为这是因为每一次 执行查询构建器代码, 在DAO中说,Hibernate会生成 中的表的新别名 查询。在Oracle中,这意味着每一个 时间新的基于Criteria的查询 运行,数据库必须创建一个QEP - 查询执行计划 - 因为它无法执行 匹配它给出的SQL 任何在其缓存中。创建QEP可以 需要30%的时间 Oracle响应SQL语句, 所以对于第二次和随后的 执行相同(但别名 名称)SQL语句,Criteria有一个 内置开销使其达到50% 比直接HQL慢。
不再是这种情况了 Hibernate 3.3及以上版本。 如果是的话 从来没有真正存在疑问 Hibernate团队肯定会瞄准 尽可能创建最佳SQL 。 独立测试表明了 相同的查询由。生成 重复后的Criteria接口 调用跨越事务的调用 相当于运行 负载下的应用程序在每种情况下 查询保持相同而且是 因此可以被Oracle缓存。
但是,有一个道理, 因为有必要创建 每次使用Criteria进行查询 接口,而使用命名查询 在HQL中定义允许 应用程序中的预编译 启动。但是,这需要一些 透视。创造时间 一个简单的“之间”查询使用 Criteria接口大约是 平均PC上3ms。嵌入HQL 在应用程序内不是一个好的 替代方案,因为它没有导致 一种直观的维护机制 具有不同获取的查询 策略,所以基于标准 方法被认为是更好的 2。
因此博客基本上指出,主要区别在于Criteria接口可能会引入几毫秒的额外处理开销,这可以通过直接HQL方法来避免。 HQL在查询表达方面也更为简洁,许多人会觉得很有吸引力。
简而言之,差异非常小,您无需担心。