Dot-Net

NHibernate Linq Query 比 HQL 慢 3 倍

  • June 22, 2011

我有一個執行查詢 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應用於返回的整個序列。

就像是:

  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 查詢相同。

引用自:https://stackoverflow.com/questions/6256659