Pregunta Solucionar el problema de rendimiento de Workbox de Sitecore


En la caja de trabajo de Sitecore, (Sitecore.Shell.Applications.Workbox), en el DisplayStates(IWorkflow workflow, XmlControl placeholder) método, Sitecore utiliza el siguiente método para recuperar elementos en un estado de flujo de trabajo particular.

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

En nuestra base de datos maestra hay como 650,000 elementos para ser consultados. Se tarda 1 ½ minutos en cargar Workbox. Eché un vistazo a lo que sucede dentro del método "this.GetItems (state, workflow)" usando dotpeek.

Internamente, construye la siguiente consulta que tardó 1 ½ minutos en ejecutarse en la base de datos maestra (seleccione 36 elementos de más de 650,000 elementos),

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

¿Hay alguna forma de mejorar el rendimiento en Workbox?


7
2017-09-03 11:29


origen


Respuestas:


Puedes usar Lucene para recuperar elementos en un estado de flujo de trabajo particular. En primer lugar, debe asegurarse de que está indexando campos estándar agregando la siguiente configuración a la Sitecore.config:

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

entonces necesitas reconstruir el system índice. Finalmente puedes actualizar el GetItems método:

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();
    }
}

11
2017-09-03 15:29