NHibernate Linq Query比HQL慢3倍

时间:2011-06-06 18:54:04

标签: .net nhibernate hql linq-to-nhibernate nhibernate.search

我有一个运行查询5000次的简单测试。查询的linq版本占用HQL的3倍,缓存的Linq版本比HQL的缓存版本慢得多

HQL:

session.CreateQuery(String.Format("from Episode where SeriesId='{0}' and SeasonNumber='{1}' and EpisodeNumber='{2}'", seriesId, seasonNumber, episodeNumber))
               .SetMaxResults(1)
               .SetCacheable(true)
               .UniqueResult<Episode>();

的LINQ:

session.Query<Episode>()
       .Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber)
       .Cacheable()
       .FirstOrDefault();

以下是结果

HQL:   Cached: less than a second   No-Cache: 5 seconds
LINQ:  Cached: 8 seconds            No-Cache: 15 seconds

我只是想确保我遇到了预期的开销,而不是我做错了。

如果那个头顶在那里并且我可以做的不多,你能否建议一个中间地带,这需要更少的琴弦但提供更好的性能?

注意: 我在Fluent Nhibernate中的缓存设置 .Cache(c => c.UseQueryCache().UseSecondLevelCache().UseMinimalPuts().ProviderClass<HashtableCacheProvider>())

1 个答案:

答案 0 :(得分:10)

我猜问题如下。这个查询:

session.Query<Episode>()
       .Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber)
       .Cacheable()
       .FirstOrDefault();

从数据库加载所有剧集,将它们放入缓存中,然后返回集合的第一个实例。调用FirstOrDefault后,将执行Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber)的查询,然后对返回的整个序列应用FirstOrDefault

类似的东西:

  1. .Where(c => c.SeriesId == seriesId && c.SeasonN... SQL已执行
  2. .FirstOrDefault()将对1的集合的所有元素进行评估。
  3. 所以如果你尝试类似

    的话
    session.Query<Episode>()
           .Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber)
           .Cacheable()
           .SetMaxResults(1)
           .UniqueResult();
    

    它的行为应该与您的HQL查询相同。