7

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

DataUri[] items = this.GetItems(state, workflow);

在我们的主数据库中,大约有 650,000 项要查询。加载 Workbox 大约需要 1.5 分钟。我使用 dotpeek 查看了“this.GetItems(state, workflow)”方法内部发生了什么。

在内部,它构建了以下查询,该查询在主数据库中运行了 1.5 分钟(从 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

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

4

1 回答 1

11

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

<setting name="Indexing.IndexStandardTemplateFields" value="true"/>

那么你需要重建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();
    }
}
于 2013-09-03T15:29:45.717 回答