标准v / s HQL .who更快?

时间:2010-12-14 20:45:37

标签: hibernate

我一直在读一些回答,但我仍然感到困惑。为什么?因为你提到的差异与绩效无关。它们与易用性有关。(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,并且它不会更改表的别名。

我很困惑。如果有人知道主要原因,请帮助我们。感谢

1 个答案:

答案 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在查询表达方面也更为简洁,许多人会觉得很有吸引力。

简而言之,差异非常小,您无需担心。