如何提高sitecore中的选择后代速度?

时间:2016-08-08 14:50:15

标签: c# sitecore

我需要在某个特定项目下选择按模板ID过滤的所有子项(后代)项目。 我可以用3种方式做到这一点:

  1. 使用GetDescendants myitem.Axes.GetDescendants().Where(x => x.IsOfTemplate(MyItem.TemplateId)).Select(x => (MyItem)x).ToList();
  2. 使用xPath

     string q = string.Format("{0}//*[@@templateid='{1}']", myItem.Paths.Path, MyItem.TemplateId);
                var result = myItem.Database.SelectItems(q);
    
  3. 使用Sitecore Search API

  4. 我的情况不能使用#3。让我跳过它。

    Xpath选择器#2应该比#1工作得更快,但问题是第一次调用某个路径。

    由于某种原因,首先使用某个特定路径调用内容树的速度非常慢。 在第一次调用之后类似的调用非常快,使用#1或#2并不重要。 Sitecore添加一些缓存。

    如何提高首次通话的速度?

2 个答案:

答案 0 :(得分:2)

答案是总是#3 - 就其本质而言,后代步行将是一个缓慢的操作。特别是如果你的起始项目有很多后代。

Sitecore Search API使用Lucene或SOLR索引,可以非常快速地搜索数千/数百万条记录。该名称使其看起来应该仅用于站点搜索,但实际上它应该用于您可能使用Sitecore查询或XPath的大多数操作。

我不确定你为什么不选择这个。但是你会很难加速后代树的行走。您唯一的选择是重构内容树,以便不需要步行。

答案 1 :(得分:1)

虽然有很多方法可以检索项目(使用Mark Cassidy建议的链接数据库,使用Siteocre Search API等),但问题在于您的缓存。如果查询第二次运行得足够快,但第一次运行缓慢,则可能是缓存的某些部分被清空然后重新填充。这很可能是以下之一:SqlDataProvider - 预取数据 master | web [data]
master | web [itempaths]
master | web [items]
master | web [路径]

要调查此问题,请使用/sitecore/admin/cache.aspx上的admin缓存页面,并特别注意缓存大小,但要特别注意可能受影响的缓存的增量(缓存大小的更改)。如果增量具有负值,则刷新缓存以为更新的数据腾出空间。您需要考虑增加缓存的大小。

还请记住,应该为运行Sitecore实例的特定环境配置缓存,例如回收应用程序池将刷新缓存。如果您的查询从一开始就快速运行至关重要,那么您可以考虑将特定项添加到预取缓存中。在应用程序启动时将项添加到预取高速缓存会产生启动时间的成本。

还请记住,在查看运行缓慢的代码时,缓存配置应该是最后的手段 - 它只是处理症状而不是根本原因。