2009-01-08 73 views
4

我专注于这个问题“报告类型的”查询(计数,平均等即那些不返回域模型本身),我只是想知道如果使用HQL有任何固有的性能优势,因为它可能能够利用二级缓存。或者甚至更好 - 缓存整个查询。不HQL有超过SQL的集团通过什么adavantages查询

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

我应该知道的其他任何好处?

[我使用NHibernate的,但我认为在这种情况下有什么适用于Hibernate会同样适用于NHibernate的]

回答

-4

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

+3

感谢您的洞察力。现在,你想尝试回答实际问题。 – berko 2009-01-09 00:00:40

+0

对于报告,您可能想要使用SQL。 – yfeldblum 2009-01-09 00:02:08

2

没有优势。 HQL不会超越直接数据库查询来执行数据聚合和计算。 的类似结果:

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

总是会在DB执行得更快,然后在HQL。注意我说总是,因为采取'取决于你的情况'的思路是不合时宜的。如果它与数据和数据聚合有关;在SQL中执行。

1

在第二级高速缓存中的对象只由检索到的ID,所以Hibernate总是运行查询,以获得ID的列表,然后要么从第二级缓存的或与另一查询读那些对象。另一方面,Hibernate可以在某些情况下缓存查询并避免数据库调用完全失败。但是,您必须考虑对查询中涉及的任何表进行更改会使其无效,因此您可能不会经常打开缓存。请参阅here关于查询缓存如何工作的说明。

所以您查询的成本是0,如果查询缓存,或约等于在做直接的SQL查询。根据数据更改的频率,您可以通过启用查询缓存来节省很多,否则您可能不会保存任何内容。

如果你有疑问的高容量和可以容忍陈旧的结果,我会说这是好了很多使用另一个缓存查询结果,只有到期每隔x分钟。

0

我能想到的唯一好处是,ORM查询缓存通常在(准备)语句级别的,所以如果你做同样的查询很多次机会是要重复使用一个事先准备好的声明。

不过既然你报告查询具体要求和性能,我想不出任何实际优势(我掩饰的事实,你还有其他优点,如数据访问的一致性,ORM查询VS SQL(大多数情况下用HQL编写查询会更容易),数据类型转换等)