2013-09-03 20 views
7

Sitecoreのワークボックスで(Sitecore.Shell.Applications.Workbox)DisplayStates(IWorkflow workflow, XmlControl placeholder)のメソッドでは、Sitecoreは次の方法を使用して特定のワークフロー状態のアイテムを取得します。Sitecoreワークボックスのパフォーマンスの問題を解決する

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

私たちのmasterデータベースには、問い合わせる650,000アイテムがあります。 ワークボックスをロードするのに1分の時間がかかります。私はdotpeekを使って "this.GetItems(状態、ワークフロー)"メソッドの内部で何が起こるかを見ていました。

内部的には、仕事箱でのパフォーマンスを改善する方法はあり、(650,000+項目から36の項目を選択)マスター・データベースで実行する

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 

を1½分かかった次のクエリを構築しますか?

+0

フィールドItemIDのSQLテーブルにインデックスを追加できます(まだ存在していない場合)。それは物事をスピードアップするかもしれない。 –

+0

+1よく研究された質問。 –

答えて

11

Luceneを使用して、特定のワークフロー状態のアイテムを取得できます。まず、あなたがSitecore.configに以下の設定を追加することにより、標準フィールドのインデックスを作成していることを確認する必要があります。

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

は、あなたが systemインデックスを再構築する必要があります。最後に、 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を目立たせるためには、見やすく見えます。 –

+0

偉大な答え、thx。 –

+0

このメソッドをSitecoreコード自体の中でどのように変更するのですか?あなたは私を許す必要があります - 私はかなりSitecore初心者です。 –

関連する問題