myn*_*kow 15 nhibernate performance criteria icriteria
hql和criteriaApi和QueryOver之间的性能差异是什么?是否存在一个比另一个更快或更慢的情况?
编辑:我用QueryOver和Linq扩展了问题.
=============================================
好吧,我不确定哪个回复标记为答案所以我将标记最多VoteUp的帖子.我不知道.这实际上是一个问题,而不是一个问题.
Jag*_*uar 12
由于一个简单的原因,ICriteria和HQL之间的性能特征变化很小(我不知道QueryOver).
默认情况下,ICriteria查询将尝试实现映射中定义的提取策略,而HQL默认情况下会考虑所有Lazy,并依赖于查询中的连接声明来定义急切获取的内容.
另外,ICriteria依赖于参数传递的映射,而HQL允许显式参数类型,例如IQuery.SetInt32("fooParam",5);
真正重要的是ICriteria查询的可插拔性(请参阅ICriteria.CreateCriteria(..CreateCriteria()等),其中NH引擎必须解析ICriteria并尝试生成最有效的SQL.
相反,如果HQL查询产生一致的结果,则可能更容易预测,从而使QueryCache的使用更容易.
无论哪种方式,配置都是使用ISessionFactory创建和映射定义生成一次,而不是内存中的内容,因此性能良好.
实际的SQL生成在两者之间有所不同,这就是ICriteria - > HQL的实用程序不存在的原因.
最后,我的经验告诉我,2之间的性能可能相同或者需要几毫秒.
作为旁注,在映射中尽可能多地声明将导致更简洁的sql生成以及NHibernate操作,例如对于Length.hbm.xml中的字符串属性映射将导致NHibernate检查字符串长度,然后再转到数据库.
就QueryOver而言,我希望性能与Criteria API完全相同,因为它是作为该API的扩展而构建的.因此,对于两个API中的等效查询,我希望生成相同的数据库查询.我在QueryOver和Criteria接口之间注意到的唯一区别是我发现QueryOver接口"更干净",使用起来更愉快.
根据我的经验,Criteria API比HQL界面获得了更多的"爱".我遇到了一些情况,我可以使用条件接口来表达某些查询,我找不到在HQL接口中表达的等效方法.
关于性能,我发现查询被"询问"的方式比选择Criteria API与HQL与QueryOver相比更能影响性能.我会使用为您提供最自然的思维界面.
由于改进的语法和类型安全性,QueryOver 在大多数方面都是 Criteria 的一个非常好的替代品。但是,应该注意的是,在 QueryOver 中处理 lambda 表达式的成本可能很高(我猜这同样适用于 LINQ 查询)。因此,虽然执行最终 SQL 查询不会比其他方法(ICriteria、HQL)花费更长的时间,但将查询对象转换为适当的 SQL 查询确实需要更长的时间。
例如,我们一直在开发一个每秒运行数百个 QueryOver 查询的应用程序(使用 ADO.NET 批处理支持),我们发现将查询转换为 ICriteria 几乎使我们执行查询的能力提高了一倍,并将 CPU 使用率减半。我猜如果使用二级缓存和查询缓存,处理 lambda 表达式的开销会大大减少;但由于这不适合我们的应用,所以我自己没有这样做。
关于您更普遍的问题,即哪个更快:这确实取决于。唯一可靠的判断方法是运行分析工具(NHProf 在此类场景中发挥了神奇作用)。但一般来说,HQL 最接近 SQL,因此最灵活,允许您有更大的范围来优化查询。然而,对于绝大多数简单到中等复杂度的查询,ICriteria 和 HQL 之间几乎没有区别。如果您的查询是动态构建的,那么 ICriteria 查询会更容易使用。