【问题标题】:Umbraco RelationService.GetByParentId(memberId) slow. Fires two queries per itemUmbraco RelationService.GetByParentId(memberId) 慢。每个项目触发两个查询
【发布时间】:2015-07-08 02:34:58
【问题描述】:

我目前正在尝试通过调用来获取一位父母的所有关系项目:

var items = ApplicationContext.Current.Services.RelationService.GetByParentId(members.GetCurrentMemberId()).ToArray();

一切正常。除了当我查看 MiniProfiler 时,我可以看到它会触发每个项目的两个查询,这会导致大量项目出现一些主要的性能问题。

我查看了 UmbracoCMS 代码,发现了这段代码:

protected override IEnumerable<IRelation> PerformGetByQuery(IQuery<IRelation> query)
{
    var sqlClause = GetBaseQuery(false);
    var translator = new SqlTranslator<IRelation>(sqlClause, query);
    var sql = translator.Translate();

    var dtos = Database.Fetch<RelationDto>(sql);

    foreach (var dto in dtos)
    {
        yield return Get(dto.Id);
    }
}

dtos 上的 foreach 正在将每个 MoveNext() 的查询发送到 umbracoRelationType 表。 Get() 方法实际上是从umbracoRelation 表中查询单个项目。 我认为它应该利用那里的缓存,但显然不是。

无论如何。如何在这里提高性能?我是否可以在不完全绕过 Umbraco 的情况下以某种方式仅通过一次查询获得内容?

我正在使用 Umbraco 7.2.6

【问题讨论】:

  • 也许在our.umbraco.org 上问同样的问题 - 或者最终在issues.umbraco.org 上创建一个问题?我知道这不会自动解决您的问题,但也许更多地关注它可以让您更接近:-)
  • 谢谢。我在这里提交了问题:issues.umbraco.org/issue/U4-6801
  • 您的 MiniProfiler 配置文件屏幕截图从 40 秒开始!我更感兴趣的是那段时间发生的事情,而不是你发布的 sn-p 期间发生的事情。

标签: c# umbraco umbraco7


【解决方案1】:

我建议获取父节点或 Id - 然后使用

ApplicationContext.Services.RelationService.GetById(parent.Id)
因为它遭受的数据库查询较少。

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 2021-09-07
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多