hql和criteriaapi和查询之间的性能差异是什么?是否有任何情况,其中一个人比另一个更快或更慢?

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

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

嗯,我不确定将标记为答案的响应,所以我将标记大多数原料的帖子。我不知道。这实际上比一个问题更多的讨论。

有帮助吗?

解决方案

iCRITERIA和HQL之间的性能特征在很小的原因下少(我不了解Queryover)。

默认情况下,icriteria查询将尝试实现您的映射中定义的获取策略,而默认情况下,HQL默认考虑一切懒惰,请取决于您的查询中的加入声明以定义急切获取的内容。

另外,iCriteria取决于参数通过的映射,而HQL允许显式参数类型。 iquery.setint32(“fpoparam”,5);

真正重要的是iCriteria查询的可插拔性(参见iCriteria.createCriteria()。NH引擎必须解决ICRITERIA并尝试生成最有效的SQL的CREATERITERIA()等。

在相反的一侧,它可能更容易预测,如果HQL查询将产生一致的结果,并且如此使QueryCache使用更容易。

要么使用issessionFactory创建和映射定义和映射定义以及内存的映射定义生成一次,所以性能好。

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

到底,我的经验表明,2之间的性能可能是同样的给药或占用一些毫秒。

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

其他提示

就查询而言,我希望性能与标准API相同,因为它被构建为该API的扩展。因此,对于两个API中的等效查询,我会期望生成相同的数据库查询。我在查询和标准界面之间指出的唯一区别是我发现Queryover接口是“更清晰的”和更令人愉快的工作。

在我的经验中,标准API已经收到了比HQL界面更多的“爱”。我已经遇到了我可以用标准界面表达某些查询的情况,即我找不到在HQL接口中表达的等效方式。

关于性能,我找到了查询“被问到”的方式有更多的性能,而不是选择标准API与HQL与查询。我会使用界面,为您提供最自然的思维。

Queryover是由于语法和类型安全性的大多数方面的标准非常好的替代。但是,应该指出的是,处理查询中的Lambda表达式 can 是昂贵的(我猜的是Linq查询的相同)。因此,在执行结束时SQL查询不需要超过其他方法(IcRiteria,HQL),将查询对象转换为适当的SQL查询确实需要更长的时间。

作为示例,我们一直在开发一个运行数百个查询的应用程序一秒钟(使用ADO.NET批处理支持),我们发现将查询转换为IcRiteria几乎加倍我们执行查询和减半CPU使用的能力。我猜,如果使用二级缓存和查询缓存,则可以很大减少参与处理Lambda表达的开销;但由于这不适合我们的应用程序,我还没有自己这样做。

关于您的更广泛的问题是更快的:它真的取决于。唯一的确定方式是通过运行分析工具(NHProf Works Wonders,如此)。但一般来说,HQL是最接近SQL的,因此最灵活,允许您更加灵活,以优化您的查询。但是,对于绝大多数简单到中间复杂性查询,ICRITERIA和HQL之间几乎没有区别。如果您的查询是动态构建的,则iCriteria查询更易于使用。

我尚未找到两者之间的任何区别。所说的 - HQL具有在标准-API中不可用的功能。

如果您使用前者或后者,它主要是风格和个人偏好问题。与您的查询转换为SQL的翻译在查询时不会占用。

从知之甚少的人: http://ayende.com/blog/archive/2009/06/01/nhimernate-qure-ure-ndash-should-i-use-hql-or-criteria.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top