gpt4 book ai didi

.net - NHibernate Linq 查询比 HQL 慢 3 倍

转载 作者:行者123 更新时间:2023-12-03 22:33:59 26 4
gpt4 key购买 nike

我有一个简单的测试,可以运行 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>();

林克:
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 查询相同。

    关于.net - NHibernate Linq 查询比 HQL 慢 3 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6256659/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com