解决Sitecore工作箱性能问题

Dha*_*777 7 sitecore sitecore6 sitecore-workflow

在Sitecore工作箱中(Sitecore.Shell.Applications.Workbox),在该DisplayStates(IWorkflow workflow, XmlControl placeholder)方法中,Sitecore使用以下方法检索特定工作流状态中的项目.

DataUri[] items = this.GetItems(state, workflow);
Run Code Online (Sandbox Code Playgroud)

在我们的主数据库中,有650,000个项目需要查询.加载工作箱需要1分半钟.我看看使用dotpeek在"this.GetItems(state,workflow)"方法中发生了什么.

在内部,它构造以下查询,在主数据库中运行1½分钟(从650,000多项中选择36项),

SELECT *
FROM VersionedFields INNER JOIN Items ON VersionedFields.ItemId = Items.Id
WHERE ItemId IN (SELECT ItemId FROM SharedFields WHERE FieldId=Workflowengine field AND Value= workflowengine)
           AND FieldId=workflow state AND Value= workflowstate value 
ORDER BY Name, Language, Version
Run Code Online (Sandbox Code Playgroud)

有没有办法提高Workbox的性能?

Mar*_*lak 11

您可以Lucene用于检索特定工作流状态的项目.首先,您需要确保通过将以下设置添加到以下内容来索引标准字段Sitecore.config:

<setting name="Indexing.IndexStandardTemplateFields" value="true"/>
Run Code Online (Sandbox Code Playgroud)

那么你需要重建system索引.最后你可以更新GetItems方法:

private static DataUri[] GetItems(WorkflowState state, IWorkflow workflow)
{
    using (IndexSearchContext indexSearchContext = SearchManager.GetIndex("system").CreateSearchContext())
    {
        return indexSearchContext
            .Search(new TermQuery(new Term("__workflow state", state.StateID.ToLower())), int.MaxValue)
            .FetchResults(0, int.MaxValue)
            .Select(result => result.GetObject<Item>())
            .Where(item => item != null
                && item.Access.CanRead()
                && (item.Access.CanReadLanguage() && item.Access.CanWriteLanguage())
                && (Context.IsAdministrator || item.Locking.CanLock() || item.Locking.HasLock()))
            .Select(item => new DataUri(item.ID, item.Language, item.Version))
            .ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)