Microsoft Dynamics CRM で AsyncOperationBase テーブルが大きくなりすぎるとパフォーマンスが低下する

適用先
Dynamics CRM 4.0 Microsoft Dynamics CRM 2011 Dynamics CRM 2013 Dynamics CRM 2015

現象

Microsoft Dynamics CRM 4.0、Microsoft Dynamics CRM 2011、Microsoft Dynamics CRM 2013、または Microsoft Dynamics CRM 2015 を実行すると、AsyncOperationBase テーブルが非常に大きくなります。 テーブルに数百万件のレコードが含まれていると、パフォーマンスが低下します。

さらに、次のようなエラーが Microsoft Dynamics CRM を実行しているサーバーのアプリケーション イベント ログに記録されます。

イベントの種類: エラー

ソース : MSCRMDeletionService

イベント カテゴリ: なし

イベント ID: 16387

日付: 2009/01/26

時刻: 午前 11 時 41 分 54 分

ユーザー: N/A

コンピューター: CRMSERVER

説明: エラー: 削除サービスが table=CleanupInactiveWorkflowAssembliesProcedure をクリーンできませんでした。詳細については、http://go.microsoft.com/fwlink/events.asp の「ヘルプとサポート センター」を参照してください。

解決策

この問題を解決するには、**<OrgName>_MSCRM データベースに対して次のスクリプトを実行して、AsyncOperationBase テーブルのクリーンアップを実行します。ここで、placeholder<OrgName>** は実際のorganization名を表します。

警告 データをクリーンアップする前に、場合によっては完了したシステム ジョブにビジネス価値があり、長期間保存する必要があることに注意してください。 したがって、最初にorganizationの管理スタッフと話し合う必要があります。

影響を受けるシステム ジョブ:

  • SQM データ収集。 ソフトウェア品質指標は、カスタマー エクスペリエンス プログラムのデータを収集します。

  • Update Contract States SQL ジョブ。 このジョブは、1 日 1 回午前 0 時に実行されます。 このジョブは、期限切れの契約を期限切れの状態に設定します。

  • 組織 フル テキスト カタログ インデックス。 CRM でサポート技術情報の記事を検索するためにデータベースにフルテキスト インデックスを設定します。

定期ジョブがキャンセルされた場合、それらは削除されます。

メモ

  • Microsoft Dynamics CRM の場合このサポート技術情報の資料に記載されているSQLスクリプトは、1回限りの作業です。 これをSQLジョブとして追加して、毎晩、毎週、または毎月定期的に実行できます。 CRM の実行中に、ビジネス ニーズに応じてこの記事を毎週適用するか、カスタムの一括削除ジョブを作成してソリューションを適用する必要があります。 (BulkDeleteRequest.QuerySet プロパティ、BulkDeleteRequest クラス、および削除順序については、CRM SDK ドキュメントを参照してください)

  • ワークフローの AsyncOperation レコードと対応するレコードが WorkflowLogBase オブジェクトから削除されていることを確認します。

  • 対応する bulkdeletefailure レコードと bulkdeleteoperation レコードがすべて削除されていることを確認してください。

  • 型の状態コードが 3 で、型の状態コードが 30 または 32 の場合は、次の非同期操作型のみが削除されることを確認してください。

    • ワークフロー拡張タスク (1)
    • SQM データの収集 (9)
    • PersistMatchCode (12)
    • FullTextCatalogIndex (25)
    • UpdateContractStates (27)
    • ワークフロー (10)
IF EXISTS (SELECT name from sys.indexes
WHERE name = N'CRM_AsyncOperation_CleanupCompleted')
      DROP Index AsyncOperationBase.CRM_AsyncOperation_CleanupCompleted
GO
CREATE NONCLUSTERED INDEX CRM_AsyncOperation_CleanupCompleted
ON [dbo].[AsyncOperationBase] ([StatusCode],[StateCode],[OperationType])
GO

while(1=1)
begin
declare @DeleteRowCount int = 10000
declare @rowsAffected int
declare @DeletedAsyncRowsTable table (AsyncOperationId uniqueidentifier not null primary key)
insert into @DeletedAsyncRowsTable(AsyncOperationId)
Select top (@DeleteRowCount) AsyncOperationId from AsyncOperationBase
where 
  OperationType in (1, 9, 12, 25, 27, 10) 
  AND StateCode = 3 
  AND StatusCode in (30, 32)

 select @rowsAffected = @@rowcount 
 delete poa from PrincipalObjectAccess poa 
   join WorkflowLogBase wlb on
    poa.ObjectId = wlb.WorkflowLogId
   join @DeletedAsyncRowsTable dart on
    wlb.AsyncOperationId = dart.AsyncOperationId
delete WorkflowLogBase from WorkflowLogBase W, @DeletedAsyncRowsTable d
where 
  W.AsyncOperationId = d.AsyncOperationId             
 delete BulkDeleteFailureBase From BulkDeleteFailureBase B, @DeletedAsyncRowsTable d
where 
  B.AsyncOperationId = d.AsyncOperationId
delete BulkDeleteOperationBase From BulkDeleteOperationBase O, @DeletedAsyncRowsTable d
where 
  O.AsyncOperationId = d.AsyncOperationId
delete WorkflowWaitSubscriptionBase from WorkflowWaitSubscriptionBase WS, @DeletedAsyncRowsTable d
where 
  WS.AsyncOperationId = d.AsyncOperationID 
 delete AsyncOperationBase From AsyncOperationBase A, @DeletedAsyncRowsTable d
where 
  A.AsyncOperationId = d.AsyncOperationId
/*If not calling from a SQL job, use the WAITFOR DELAY*/
if(@DeleteRowCount > @rowsAffected)
  return
else
  WAITFOR DELAY '00:00:02.000'
end

        
      

削除スクリプトのパフォーマンスの向上

  • Microsoft Dynamics CRM の全体的なパフォーマンスを向上させるには、Microsoft Dynamics CRM のオフピーク時間中に実行するように Microsoft Dynamics CRM 削除サービスをスケジュールします。 既定では、サービスは Microsoft Dynamics CRM がインストールされた時点で実行されます。 ただし、既定の時刻ではなく午後 10:00 に実行するようにサービスを設定できます。 これを行うには、Microsoft Dynamics CRM ScaleGroup ジョブ エディターを使用します。 詳細については、次の CodePlex Web サイトを参照してください。
    http://crmjobeditor.codeplex.com/ メモ

    1. この操作はスクリプトのパフォーマンスには直接影響しません。
    2. Microsoft Dynamics CRM 4.0 のジョブ エディターは廃止され、使用できなくなりました。
  • この記事の削除スクリプトのパフォーマンスを向上させるため、および同様の削除を実行する Microsoft Dynamics CRM Deletion Service コードを改善するには、この記事の削除スクリプトを実行する前に、次の 3 つのインデックスを OrganizationName_MSCRM データベースに追加します。

    CREATE NONCLUSTERED INDEX CRM_WorkflowLog_AsyncOperationID ON [dbo].[WorkflowLogBase] ([AsyncOperationID])
    GO 
    
    CREATE NONCLUSTERED INDEX CRM_DuplicateRecord_AsyncOperationID ON [dbo].[DuplicateRecordBase] ([AsyncOperationID])
    GO
    
    CREATE NONCLUSTERED INDEX CRM_BulkDeleteOperation_AsyncOperationID ON [dbo].[BulkDeleteOperationBase]
    (AsyncOperationID)
    GO
    
    

    注: これらのインデックスを追加しない場合、削除スクリプトの実行に数時間かかることがあります。

  • このスクリプトの実行中は、Microsoft Dynamics CRM 非同期処理サービスを停止してください。

  • オプション: 次のインデックスを再構築し、統計を更新します。

    -- Rebuild Indexes & Update Statistics on AsyncOperationBase Table 
    ALTER INDEX ALL ON AsyncOperationBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)
    GO 
    -- Rebuild Indexes & Update Statistics on WorkflowLogBase Table 
    ALTER INDEX ALL ON WorkflowLogBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)
    
    GO
    
  • 次のコマンドを使用して (推奨されるオフ ピーク時に) このクエリに関連するすべてのテーブルのフル スキャンで統計情報を更新します。

    UPDATE STATISTICS [dbo].[AsyncOperationBase] WITH FULLSCAN
    UPDATE STATISTICS [dbo].[DuplicateRecordBase] WITH FULLSCAN
    UPDATE STATISTICS [dbo].[BulkDeleteOperationBase] WITH FULLSCAN
    UPDATE STATISTICS [dbo].[WorkflowCompletedScopeBase] WITH FULLSCAN
    UPDATE STATISTICS [dbo].[WorkflowLogBase] WITH FULLSCAN
    UPDATE STATISTICS [dbo].[WorkflowWaitSubscriptionBase] WITH FULLSCAN
    
  • オプション: MSCRM データベースの復旧モデルをシンプルに変更して、Microsoft SQL Server ログの過剰生成を回避します。 SQL Server 2005 の場合は、Microsoft SQL Server Management Studio に管理者としてログオンし、<org_name>_MSCRM データベースを右クリックし、[プロパティ]、[オプション]、[復旧モデル] の順にクリックします。 [ シンプル] にマークし、[ OK] をクリックします。 このスクリプトを初めて実行した後は、最適なデータ回復モデルを実現するために、 <org_name>_MSCRM データベース復旧モデルを FULL に戻す必要があります。

  • スクリプトのパフォーマンスを向上させるために、 @DeleteRowCount 値の 10,000 を減らすことができます

            
この記事のスクリプトによって削除されるレコードの数を確認するには、OrganizationName_MSCRM データベースに対して次のカウント スクリプトを実行します。


Select Count(AsyncOperationId)from AsyncOperationBase WITH (NOLOCK)
where OperationType in (1, 9, 12, 25, 27, 10) 
AND StateCode = 3 AND StatusCode IN (30,32) 

スクリプト エラー

クリーンアップ スクリプトを実行すると、次のようなエラー メッセージが表示される場合があります。

DELETE ステートメントが REFERENCE 制約 "asyncoperation_workflowwaitsubscription" と競合しています。 データベース "Contoso_MSCRM"、テーブル "dbo.WorkflowWaitSubscriptionBase", column 'AsyncOperationId'.ステートメントは終了しました。

            
このエラー メッセージが表示された場合は、クリーンアップ スクリプトを停止し、次の手順に従って、完了またはキャンセルされたワークフローに存在する残りの WorkflowWaitSubscription レコードを削除します。 これらのレコードは、ワークフローが完了またはキャンセルされたときに削除されるはずであるため、すでに存在しないはずです。 このクエリから返されるレコードは表示されないはずです。 このクエリに表示される WorkflowWaitSubscriptionBase テーブルに残っているものはすべて孤立したレコードです。 Microsoft CRM 非同期プロセスがキャンセル済みまたは完了済みの状態であるため、UI からこれらのレコードを削除することはできません。

次のスクリプトは、完了およびキャンセルされたワークフロー レコードに対して孤立した WorkflowWaitSubscriptionBase レコードの数を確認します。

select count(*) from workflowwaitsubscriptionbase WITH (NOLOCK) 

where asyncoperationid in 

(Select asyncoperationid from AsyncOperationBase WITH (NOLOCK) 

where OperationType in (1, 9, 12, 25, 27, 10) 

AND StateCode = 3 AND StatusCode IN (30,32)) 

次のスクリプトは、完了およびキャンセルされたワークフロー レコードの座礁した WorkflowWaitSubscriptionBase レコードの WorkflowWaitSubscriptionBase レコードを削除します。

delete from workflowwaitsubscriptionbase 
where asyncoperationid in(Select asyncoperationidfrom AsyncOperationBase
where OperationType in (1, 9, 12, 25, 27, 10) 
AND StateCode = 3 AND StatusCode IN (30,32))

この delete ステートメントを実行すると、AsyncoperationBase およびワークフローのクリーンアップ スクリプトが正常に完了します。

追加情報

関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。

954929 AsyncOperation エンティティが [Org]_MSCRM データベースのかなりの部分を使用し、Microsoft Dynamics CRM のパフォーマンスが低下する原因となります

957871 Microsoft Dynamics CRM 4.0 では、ワークフロー拡張タスクのレコードにより、MSCRM データベースの AsyncOperationBase テーブルが大きくなりすぎます。 ソフトウェア更新プログラムに関する用語の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。

824684 Microsoft ソフトウェア更新プログラムの説明で使用される一般的な用語の解説Microsoft Business Solutions CRM ソフトウェア修正プログラムおよび更新プログラム パッケージの用語の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。

887283 Microsoft Business Solutions CRM ソフトウェアの修正プログラムおよび更新プログラム パッケージの命名基準