Решить проблему производительности рабочей панели Sitecore

В рабочем поле Sitecore, (Sitecore.Shell.Applications.Workbox), в методе DisplayStates(IWorkflow workflow, XmlControl placeholder) Sitecore использует следующий метод для извлечения элементов в определенном состоянии рабочего процесса.

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

В нашей основной базе данных есть около 650 000 элементов, которые нужно запросить. Загрузка Workbox занимает около 1,5 минут. Я посмотрел, что происходит внутри метода this.GetItems (state, workflow), используя dotpeek.

Внутренне он создает следующий запрос, выполнение которого заняло 1,5 минуты в базе данных master (выберите 36 элементов из 650 000+ элементов),

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?


person Dhanuka777    schedule 03.09.2013    source источник
comment
Вы можете добавить индекс в таблицу SQL в поле ItemID (если его там еще нет). Это может ускорить процесс.   -  person Martijn van der Put    schedule 03.09.2013
comment
+1 хорошо проработанный вопрос.   -  person Dan Solovay    schedule 04.09.2013


Ответы (1)


Вы можете использовать Lucene для получения элементов в определенном состоянии рабочего процесса. Сначала вам нужно убедиться, что вы индексируете стандартные поля, добавив следующий параметр в Sitecore.config:

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

тогда вам нужно перестроить system index. Наконец, вы можете обновить метод 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();
    }
}
person Marek Musielak    schedule 03.09.2013
comment
Как вы собираетесь изменить этот метод, поскольку он находится в самом коде Sitecore? Вы должны меня простить - я новичок в Sitecore. - person Keith Jackson; 06.02.2014
comment
Вам нужно изменить sitecore/shell/Applications/Workbox/Workbox.xml и обновить CodeBeside в этом файле на свой собственный класс, который будет унаследован от класса Sitecore.Shell.Applications.Workbox.WorkboxForm. Затем вы можете переопределить все, что вам нужно в своем классе. - person Marek Musielak; 07.02.2014
comment
Я столкнулся с той же проблемой, что некоторые клиенты жаловались, что рабочий ящик слишком медленно отображается. Я попробовал решение @MarekMusielak, но есть ли какие-либо меры, которые могут проверить различия? После добавления приведенного выше кода некоторые клиенты даже сказали, что он работает медленнее, чем раньше. Сайт в настоящее время использует Sitecore 6.6. И я хотел бы спросить, как перестроить системный индекс? Я могу найти для восстановления поискового индекса только с панели управления. Могу ли я восстановить это? - person HUNG; 09.11.2016
comment
Я обнаружил, что есть файл блокировки в / Data / indexes / __ system lucene-cb7bb949d8cbd6d1648c5f8d0b06d7bf-write.lock - person HUNG; 09.11.2016