14

我有一个运行查询 5000 次的简单测试。查询的linq版本占用HQL的3倍,缓存的Linq版本明显慢于缓存的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>();

林克:

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

这是结果

HQL:缓存:不到一秒无缓存:5 秒
LINQ:缓存:8 秒无缓存:15 秒

我只是想确保我正在经历预期的开销,而不是我做错了什么。

如果头顶存在并且我无能为力,您能否建议一个中间立场,这将需要更少的字符串但提供更好的性能?

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

4

1 回答 1

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 的所有元素进行评估。

所以如果你尝试类似的东西

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

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

于 2011-06-22T08:21:42.367 回答