2013-09-03 5 views
7

साइटकोर वर्कबॉक्स में (Sitecore.Shell.Applications.Workbox), DisplayStates(IWorkflow workflow, XmlControl placeholder) विधि में, साइटकोर किसी विशेष वर्कफ़्लोस्टेट में आइटम पुनर्प्राप्त करने के लिए निम्न विधि का उपयोग करता है।साइटकोर वर्कबॉक्स प्रदर्शन समस्या हल करें

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

हमारे मास्टर डेटाबेस में 650,000 जैसी मदों पूछे जाने हैं। वर्कबॉक्स लोड करने में 1½ मिनट लगते हैं। मैंने देखा कि "इस। गेट इटम्स (राज्य, वर्कफ़्लो)" विधि के अंदर डॉटपीक का उपयोग करके क्या होता है।

आंतरिक यह constructs निम्न क्वेरी जो मास्टर डेटाबेस (650,000+ मदों से 36 आइटम का चयन) में चलाने के लिए 1 आधा मिनट लग गए,

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 में प्रदर्शन में सुधार करने के लिए एक रास्ता है?

+0

आप क्षेत्र ItemID पर एसक्यूएल मेज पर एक सूचकांक में जोड़ सकते हैं (अगर यह पहले से ही वहाँ नहीं है): अंत में आप GetItems विधि को अपडेट कर सकते हैं। इससे चीजें तेज हो सकती हैं। –

+0

+1 अच्छी तरह से शोध प्रश्न। सूचकांक में जाने के लिए –

उत्तर

11

आप विशेष वर्कफ़्लो स्थिति में आइटम पुनर्प्राप्त करने के लिए Lucene का उपयोग कर सकते हैं। सबसे पहले आप सुनिश्चित करें कि आप Sitecore.config में निम्नलिखित सेटिंग जोड़कर मानक क्षेत्रों का अनुक्रमण रहे हैं की जरूरत है:

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

तो आप system सूचकांक के पुनर्निर्माण की जरूरत है।

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 आसान लग रहा है। –

+0

ग्रेट उत्तर, thx। –

+0

आप इस विधि को बदलने के बारे में कैसे जाते हैं क्योंकि यह साइटकोर कोड में ही है? आपको मुझे माफ कर देना होगा - मैं काफी साइटकोर न्यूबी हूं। –

संबंधित मुद्दे