2010-07-16 123 views
15

性能什么是hql和criteriaApi和QueryOver之间的区别?有没有比另一个更快或更慢的情况?NHibernate HQL vs CriteriaAPI vs QueryOver vs Linq。性能

编辑:我用QueryOver和Linq扩展了这个问题。

=============================================

嗯,我不确定哪个回答标记为答案,所以我会用大多数VoteUp标记帖子。我不知道。这实际上是一个比问题更多的讨论。

回答

11

的ICriteria和HQL之间的性能特点的小变化(我不知道QueryOver)一个简单的原因。

ICriteria查询将默认尝试实现您的映射中定义的提取策略,而默认情况下HQL会将所有内容都视为Lazy,并取决于查询中的连接声明以定义热切或非热切获取的内容。

此外,ICriteria依赖于参数传递的映射,而HQL允许显式参数类型,例如IQuery.SetInt32(“fooParam”,5); (ICriteria.CreateCriteria()。CreateCriteria()等),其中NH引擎将不得不解决ICriteria并尝试生成最有效的SQL。

在另一方面,它可能更容易预测HQL查询是否会产生一致的结果,因此可以更轻松地使用QueryCache。

无论哪种方式,使用ISessionFactory创建和映射定义生成一次配置,而不是内存中,因此性能很好。

实际的SQL生成在两者之间有所不同,这就是ICriteria - > HQL的实用程序不存在的原因。

最后,我的经验告诉我,2之间的性能可能相同或稍微减少一些毫秒。

作为一个方面说明,尽可能在映射中声明将导致更加简洁的SQL生成以及NHibernate操作,例如字符串属性映射.hbm.xml中的Length将导致NHibernate检查字符串进入数据库之前的长度。

+1

非常好。让我们看看其他人对QueryOver的看法。 – mynkow 2010-07-16 14:06:14

1

我还没有找到两者之间的任何区别。这就是说 - hql具有Criteria-API中没有的功能。

如果你使用前者或后者,这主要是一种风格和个人喜好的问题。从查询到SQL的翻译在涉及查询时并不占多大。

从那个比我更多的人:http://ayende.com/Blog/archive/2009/06/01/nhibernate-queries-ndash-should-i-use-hql-or-criteria.aspx

+0

嗯,我担心这会发生。我试图了解哪个更快,为什么。这不是两者之间的选择。其实我已经有了我的选择。那么,让我们回到HQL和Criteria的表现。 PS:顺便说一下,艾恩德说,表现相同,但我不太确定。我认为有些情况下我们有性能问题。这只是一个猜测。 – mynkow 2010-07-16 07:54:05

+0

你说你有性能问题。你使用哪种方法?我更喜欢标准,因为我认为Hibernate为你提供最快的查询 – Michel 2010-07-16 08:10:38

+2

根据我的经验,它缺乏理解其中一个API让它看起来更慢。你有没有考虑尝试NHProfiler /一些其他分析器,看看什么是花时间? 如果你有一个运行速度更快的例子 - 尝试查看输出的原始sql - 这通常是罪魁祸首。 – Goblin 2010-07-16 08:23:39

6

就QueryOver而言,我期望性能与Criteria API相同,因为它是作为该API的扩展而构建的。所以对于这两个API中的等价查询,我期望生成相同的数据库查询。我注意到QueryOver和Criteria接口之间唯一的区别是我发现QueryOver接口更“干净”,更令人愉快。

根据我的经验,Criteria API比HQL接口获得更多的“爱”。我遇到了可以使用标准接口表达某些查询的情况,我无法找到在HQL接口中表达的等效方式。

关于性能,我发现询问的方式比标准API与HQL与QueryOver的选择有更多的关系。我会使用为您提供最适合您思想的界面。

4

由于改进的语法和类型安全性,QueryOver在很多方面都是Criteria的很好的替代品。但是,应该注意的是,处理QueryOver 中的lambda表达式可能很昂贵(我想这同样适用于LINQ查询)。因此,在执行结束SQL查询的时间不会超过其他方法(ICriteria,HQL)时,将查询对象转换为适当的SQL查询确实需要更长的时间。例如,我们一直在开发一个应用程序,它每秒运行数百个QueryOver查询(使用ADO.NET批处理支持),并且我们发现将查询转换为ICriteria几乎使我们的查询执行能力翻了一番,并将CPU-用法。我猜如果使用二级缓存和查询缓存,处理lambda表达式所涉及的开销会大大降低;但由于这不适合我们的应用,我自己也没有这样做。

关于哪个更快的更一般的问题:这取决于。唯一可靠的告诉方式是通过运行分析工具(NHProf为此类场景创建奇迹)。但是一般来说,HQL最接近于SQL,因此最为灵活,可以让您有更多空间来优化您的查询。但是,对于绝大多数简单到中等复杂性的查询,ICriteria和HQL之间几乎没有差别。如果您的查询是动态构建的,那么ICriteria查询更容易处理。

+0

我们已经看到一些使用查询的性能命中。 lambda编译可能非常昂贵。 – 2015-07-31 04:11:06