【问题标题】:What adavantages does HQL have over SQL for Group By queries对于 Group By 查询,HQL 比 SQL 有什么优势
【发布时间】:2009-01-08 23:53:28
【问题描述】:

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

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

我还应该注意哪些其他好处?

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

【问题讨论】:

    标签: sql nhibernate hibernate hql


    【解决方案1】:

    优势为零。 HQL 在执行数据聚合和计算方面不会优于直接数据库查询。 类似的结果:

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

    在 DB 中的执行总是比在 HQL 中更快。请注意,我之所以说总是,是因为采取“取决于您的情况”的思维方式是很蹩脚的。如果它与数据和数据聚合有关;在 SQL 中执行此操作。

    【讨论】:

    • 其实..你知道什么是HQL吗?您给出的用 HQL 编写的选择只会发出您给出的相同 SQL。它不是在内存中做的!
    • HQL 查询,如来自 Cat cat 的 select avg(cat.weight)、sum(cat.weight)、max(cat.weight)、count(cat) 将不会收到任何性能“优势”超过 '原始 SQL '。问题中“希望”的性能优势不会实现。这是我回答的重点。
    【解决方案2】:

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

    另一方面,Hibernate 可以缓存查询并在某些情况下完全避免 DB 调用。但是,您必须考虑到对查询中涉及的任何表的更改都会使其无效,因此您可能不会经常访问缓存。请参阅here,了解查询缓存的工作原理。

    因此,如果查询被缓存,则查询的成本为 0,或者与在直接 SQL 中执行查询的成本大致相同。根据您的数据更改频率,您可能会通过启用查询缓存来节省很多,或者您可能不会保存任何东西。

    如果您有大量查询并且您可以容忍陈旧的结果,我会说最好使用另一个缓存来存储每 x 分钟到期的查询结果。

    【讨论】:

      【解决方案3】:

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

      但由于您专门要求报告查询和性能,我想不出任何实用优势(我在掩饰您还有其他优势,例如数据- 访问一致性、ORM 查询与 SQL(大多数情况下使用 HQL 编写查询更容易)、数据类型转换等)

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 感谢您的洞察力。现在您想尝试回答实际问题吗?
        • 对于报告,您可能需要使用 SQL。
        猜你喜欢
        • 1970-01-01
        • 2011-08-29
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多