如何提高sitecore中选择后代的速度
本文关键字:后代 速度 选择 何提高 sitecore | 更新日期: 2023-09-27 18:01:31
我需要在某个特定项下选择所有由模板id过滤的子项(Descendants(。我可以用三种方法来做:
- 使用GetDescendants
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搜索API
我不能用#3来处理我的案子。让我们跳过我的案子。
Xpath选择器#2应该比#1工作得更快,但问题出现在对某个路径的第一次调用中。
由于某种原因,第一次调用具有特定路径的内容树的速度非常慢。在第一次调用之后,类似的调用工作得很快,使用#1或#2并不重要。Sitecore添加了一些缓存。
如何提高首次通话的速度?
答案是总是#3-从本质上讲,后裔步行将是一项缓慢的操作。尤其是如果你的起始物品有很多后代的话。
Sitecore搜索API使用Lucene或SOLR索引,可以非常非常快速地搜索数千条/数百万条记录。这个名称让它看起来应该只用于网站搜索,但实际上它应该用于大多数可能使用Sitecore Query或XPath的操作。
我不知道你为什么没有这个选择。但你会很难加快后代树的行走速度。你唯一的选择是重组你的内容树,这样就不需要步行了。
虽然有很多方法可以检索项目(使用Mark Cassidy建议的链接数据库,使用Siteocre Search API等(,但问题在于缓存。如果查询第二次运行得足够快,但第一次运行得很慢,那么很可能是缓存的某个部分被清空,然后被重新填充。这很可能是以下情况之一:SqlDataProvider-预取数据master|web[data]
master|web[itempaths]
master|web[items]
master | web[路径]
要对此进行调查,请使用/sitecore/admin/cache.aspx上的管理缓存页面,不仅要特别注意缓存大小,还要注意可能受到影响的缓存的delta(缓存大小的变化(。如果delta值为负值,则会刷新缓存,为更新的数据腾出空间。您需要考虑增加缓存的大小。
还请记住,应该为Sitecore实例运行的特定环境配置缓存,例如,回收应用程序池将刷新缓存。如果查询必须从一开始就快速运行,那么您可以考虑将特定项目添加到预取缓存中。在应用程序启动时向预取缓存中添加项目会占用启动时间。
还请记住,在查看运行缓慢的代码时,缓存配置应该是最后的手段——它只是治标不治本。