代码之家  ›  专栏  ›  技术社区  ›  berko

对于按查询分组,HQL相对于SQL有哪些优势

  •  4
  • berko  · 技术社区  · 17 年前

    我将这个问题集中在“报告类型”查询(count、avg等,即不返回域模型本身的查询)上,我只是想知道使用HQL是否有任何内在的性能优势,因为它可以利用二级缓存。或者更好的方法-缓存整个查询。

    明显的隐含好处是NHibernate知道列名是什么,因为它已经知道模型映射。

    我还应该知道其他的好处吗?

    [我正在使用NHibernate,但我假设在这种情况下,应用于Hibernate的内容也同样适用于NHibernate]

    4 回复  |  直到 17 年前
        1
  •  2
  •   Brian    17 年前

    没有什么好处。在执行数据聚合和计算时,HQL的性能不会超过直接数据库查询。 结果如下:

    Select count(*), dept from employees group by dept
    

    在DB上的执行速度总是比在HQL中快。注意我说 总是 因为这是跛脚采取'取决于你的情况'的思路。如果它与数据和数据聚合有关,请在SQL中执行。

        2
  •  1
  •   Dan Berindei    17 年前

    二级缓存中的对象仅由id检索,因此Hibernate将始终运行一个查询以获取id列表,然后从二级缓存或使用另一个查询读取这些对象。

    另一方面,Hibernate可以缓存查询,并在某些情况下完全避免DB调用。但是,您必须考虑对查询中涉及的任何表所做的更改都会使其失效,因此您可能不会经常命中缓存。见 here 查询缓存工作方式的说明。

    因此,如果查询是缓存的,则查询的开销为0,或者与在直接SQL中执行查询的开销大致相同。根据数据更改的频率,可以通过启用查询缓存来保存大量数据,也可以不保存任何数据。

    如果您有大量的查询,并且可以容忍过时的结果,我认为最好对每x分钟过期一次的查询结果使用另一个缓存。

        3
  •  0
  •   Miguel Ping    15 年前

    我能想到的唯一优点是ORM查询通常是在(prepared)语句级别缓存的,所以如果您多次执行相同的查询,那么您可能是在重用一个prepared语句。

    但既然你特别要求 报告查询和性能 ,我想不出 实际的 优点(我忽略了这样一个事实,即您具有其他优点,如数据访问一致性、ORM查询与SQL(大多数情况下,使用HQL编写查询更容易)、数据类型转换等)

        4
  •  -4
  •   yfeldblum    17 年前

    HQL是一种对象查询语言。SQL是一种关系查询语言。