2013-09-03 8 views
7

In der Sitecore-Workbox (Sitecore.Shell.Applications.Workbox) verwendet Sitecore in der Methode DisplayStates(IWorkflow workflow, XmlControl placeholder) folgende Methode zum Abrufen von Elementen in einem bestimmten Workflowzustand.Lösen Sie das Leistungsproblem der Sitecore-Workbox

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

In unserer Datenbank master sind 650.000 Artikel zu finden. Es dauert etwa 1 ½ Minuten, um die Workbox zu laden. Ich habe geschaut, was in der Methode "this.GetItems (state, workflow)" mit dotpeek passiert.

Intern Konstrukte es die folgende Abfrage, die 1 ½ Minuten dauerte in der Master-Datenbank ausführen (wählen 36 Artikel von 650,000+ Artikeln),

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 

Gibt es eine Möglichkeit, die Leistung in Workbox zu verbessern?

+0

Sie können einen Index auf die SQL-Tabelle auf dem Feld ItemID aus (wenn es nicht bereits vorhanden ist). Das könnte die Dinge beschleunigen. –

+0

+1 gut recherchierte Frage. –

Antwort

11

Sie können Lucene zum Abrufen von Elementen in einem bestimmten Workflow-Status verwenden. Zunächst müssen Sie sicherstellen, sind Sie Standardfelder Indizierung durch die folgende Einstellung zur Ergänzung der Sitecore.config:

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

dann müssen Sie den system Index wieder aufzubauen. Schließlich können Sie die GetItems Methode aktualisieren:

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 für den Einstieg in den Index leicht aussehen. –

+0

Große Antwort, thx. –

+0

Wie ändern Sie diese Methode, da sie sich im Sitecore-Code selbst befindet? Du wirst mir vergeben müssen - ich bin ein ziemlich neuer Sitecore-Neuling. –