Workboxの起動時のパフォーマンスの向上


解説

Workboxアプリケーションのパフォーマンスは、ソリューション内のコンテンツ量とアイテム アクセス構成によって決定されます。Workboxが表示するアイテムが多ければ多いほど、Sitecoreが実行しなければならない計算処理が増え、アプリケーションのロード遅延につながります。

アイテム ワークフロー情報は、[VersionedFields]テーブルに格納されます。特定のワークフロー状態にあるアイテムを探すためのデフォルトのSQLクエリは、以下のとおりです:

SELECT TOP (maxVersionToLoad) [ItemId], [Language], [Version]
          FROM [VersionedFields] WITH (NOLOCK)
          WHERE [FieldId]='3e431de1-525e-47a3-b6b0-1ccbec3a8c98'
          AND [Value]= '{WorkflowStateID}'
          ORDER BY [Updated] desc

SQL エンジンはクエリの実行計画を選択する責任がありますが、特定の条件下では、クエリは高価な [VersionedFields] テーブル スキャンにつながる可能性があります。

解決策

  1. ワークフローはよく知られたフィールド(Sitecore.FieldIDs.State)であり、マスター データベース内のワークフロー フィールドのデータのみをカバーするフィルタリングSQLインデックスを作成することができます:
    CREATE NONCLUSTERED INDEX IX_Versioned_Workflow_Filtered
        ON VersionedFields (itemid,FieldId)
        INCLUDE (Value,language,version, updated)
        WHERE FieldId='{3E431DE1-525E-47A3-B6B0-1CCBEC3A8C98}'

    これにより、SQL エンジンのクエリ プランナーが [VersionedFields] テーブルの代わりにインデックスを使用できるようになりました。SQL インデックスを追加すると、Workbox が高速化されますが、アイテムの挿入/更新/削除の速度が若干遅くなります。

  2. Workbox.SingleWorkflowStateVersionLoad.Threshold 設定を構成に追加して、Sitecore がロードできる行数を制限します。
    <setting name="Workbox.SingleWorkflowStateVersionLoad.Threshold" value="100"/>

    Sitecoreは、デフォルトでWorkboxに2000バージョン以上をロードしません。このデフォルト値は、人が妥当な時間でレビューできる量よりもはるかに多く、レガシー システムの動作を維持するために追加されました。

  3. Sitecoreの設定でAccessResultCacheのサイズを大きくします:
    <setting name="Caching.AccessResultCacheSize" value="100MB" />
    ワークフロー状態間でアイテムを移動できるのは、十分なアクセス権限を持つユーザーのみなので、Sitecoreはアイテムごとにアクセス ルールを評価します。Sitecoreでは、アクセス権を何度も計算するのを避けるために、キャッシュ レイヤーを使用しています。データ量が増えると、キャッシュのサイズが足りなくなる可能性があり、次のような警告メッセージが表示されます:
    WARN  AccessResultCache cache is cleared by Sitecore.Caching.Generics.Cache`1+DefaultScavengeStrategy[[Sitecore.Caching.AccessResultCacheKey, Sitecore.Kernel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=null]] strategy. Cache running size was 9 MB.
  4. デフォルトのワークボックスの動作は、カスタム データ プロバイダで 'SqlDataProvider.GetItemsInWorkflowState' API をオーバーライドすることでカスタマイズ可能です。