Dot-Net
NHibernate Linq Query 比 HQL 慢 3 倍
我有一個執行查詢 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>())
我想問題如下。這個查詢:
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 查詢相同。