NHibernate Linq Query比HQL慢3倍

kay*_*one 14 .net nhibernate hql nhibernate.search linq-to-nhibernate

我有一个简单的测试,运行查询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>();
Run Code Online (Sandbox Code Playgroud)

LINQ:

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

结果如下

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>())

Chr*_*ris 10

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

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

从数据库加载所有剧集,将它们放入缓存,然后返回集合的第一个实例.当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();
Run Code Online (Sandbox Code Playgroud)

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