2013-09-03 13 views
7

Nella casella di lavoro Sitecore, (Sitecore.Shell.Applications.Workbox), nel metodo DisplayStates(IWorkflow workflow, XmlControl placeholder), Sitecore utilizza il seguente metodo per recuperare gli elementi in un determinato flusso di lavoro.Risolvi il problema delle prestazioni della cassetta di lavoro Sitecore

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

Nel nostro database principale ci sono circa 650.000 articoli da interrogare. Per caricare la casella di lavoro ci vogliono circa 1 minuto e mezzo. Ho dato un'occhiata a cosa succede all'interno del metodo "this.GetItems (state, workflow)" usando dotpeek.

Internamente costruisce la seguente query che ha avuto 1 minuto e mezzo per l'esecuzione nel database master (selezionare 36 articoli da 650,000+ articoli),

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 

Esiste un modo per migliorare le prestazioni in Workbox?

+0

È possibile aggiungere un indice alla tabella di SQL sul campo ItemID (se non è già presente). Questo potrebbe accelerare le cose. –

+0

+1 domanda ben studiata. –

risposta

11

È possibile utilizzare Lucene per recuperare elementi in particolare stato del flusso di lavoro. In primo luogo è necessario per garantire la l'indicizzazione campi standard aggiungendo la seguente impostazione alla Sitecore.config:

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

allora avete bisogno di ricostruire l'indice system. Infine è possibile aggiornare il metodo 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(); 
    } 
} 
+0

+1 per aver reso facile l'indicizzazione. –

+0

Ottima risposta, grazie. –

+0

Come si fa a cambiare questo metodo come nel codice Sitecore stesso? Dovrai perdonarmi - sono piuttosto un principiante di Sitecore. –

Problemi correlati