我有一个运行查询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>())
答案 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
。
类似的东西:
.Where(c => c.SeriesId == seriesId && c.SeasonN...
SQL已执行.FirstOrDefault()
将对1的集合的所有元素进行评估。所以如果你尝试类似
的话session.Query<Episode>()
.Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber)
.Cacheable()
.SetMaxResults(1)
.UniqueResult();
它的行为应该与您的HQL查询相同。