我需要在某个特定项目下选择按模板ID过滤的所有子项(后代)项目。 我可以用3种方式做到这一点:
myitem.Axes.GetDescendants().Where(x => x.IsOfTemplate(MyItem.TemplateId)).Select(x => (MyItem)x).ToList();
使用xPath
string q = string.Format("{0}//*[@@templateid='{1}']", myItem.Paths.Path, MyItem.TemplateId);
var result = myItem.Database.SelectItems(q);
使用Sitecore Search API
我的情况不能使用#3。让我跳过它。
Xpath选择器#2应该比#1工作得更快,但问题是第一次调用某个路径。
由于某种原因,首先使用某个特定路径调用内容树的速度非常慢。 在第一次调用之后类似的调用非常快,使用#1或#2并不重要。 Sitecore添加一些缓存。
如何提高首次通话的速度?
答案 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实例的特定环境配置缓存,例如回收应用程序池将刷新缓存。如果您的查询从一开始就快速运行至关重要,那么您可以考虑将特定项添加到预取缓存中。在应用程序启动时将项添加到预取高速缓存会产生启动时间的成本。
还请记住,在查看运行缓慢的代码时,缓存配置应该是最后的手段 - 它只是处理症状而不是根本原因。