4

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

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

我应该注意的任何其他好处?

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

4

4 回答 4

2

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

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

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

于 2009-01-09T01:37:39.260 回答
1

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

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

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

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

于 2009-03-05T13:58:38.980 回答
0

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

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

于 2011-03-31T11:15:41.007 回答
-4

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

于 2009-01-08T23:55:02.803 回答