現象
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 テーブルのクリーンアップを実行します。ここで、プレースホルダー<OrgName>** はorganizationの実際の名前を表します。
警告 データをクリーンする前に、完了したシステム ジョブにはビジネス価値があり、長期間保存する必要があることに注意してください。 そのため、まずorganizationの管理スタッフと話し合う必要があります。
影響を受けるシステム ジョブ:
SQM データ収集。 ソフトウェア品質メトリックは、カスタマー エクスペリエンス プログラムのデータを収集します。
コントラクト状態 SQL ジョブを更新します。 このジョブは、午前 0 時に 1 日に 1 回実行されます。 このジョブは、期限切れのコントラクトを期限切れの状態に設定します。
組織のフルテキスト カタログ インデックス。 CRM で Microsoft サポート技術情報の記事を検索するために、db にフルテキスト インデックスを設定します。
定期的なジョブが取り消された場合は、削除されます。
メモ
Microsoft Dynamics CRMこのサポート技術情報の記事の SQL スクリプトは、1 回限りの作業です。 これを SQL ジョブとして追加して、夜間、毎週、または月単位で定期的に実行できます。 CRM を実行するときは、ビジネス ニーズに応じてこの記事を毎週適用するか、カスタム BULK DELETE ジョブを作成してソリューションを適用する必要があります。 (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 時に実行するように設定できます。 これを行うには、Microsoft Dynamics CRM ScaleGroup ジョブ エディターを使用します。 詳細については、次の CodePlex Web サイトを参照してください。
http://crmjobeditor.codeplex.com/ ノート- このアクションは、スクリプトのパフォーマンスに直接影響しません。
- Microsoft Dynamics CRM 4.0 のジョブ エディターは廃止され、使用できなくなります。
この記事の削除スクリプトのパフォーマンスを向上させ、同様の削除を実行するMicrosoft Dynamics CRM削除サービス コードを改善するには、この記事の削除スクリプトを実行する前に、OrganizationName_MSCRM データベースに次の 3 つのインデックスを追加します。
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省略可能 Microsoft SQL Server ログの過剰な生成を回避するために、MSCRM データベースの復旧モデルを Simple に変更します。 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", 列 '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 レコードを削除します。
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 ワークフロー拡張タスク レコードを使用すると、MSCRM データベースの AsyncOperationBase テーブルが Microsoft Dynamics CRM 4.0 で大きくなりすぎ、ソフトウェア更新プログラムの用語の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を表示します。
824684 Microsoft ソフトウェア更新プログラムの説明に使用される標準用語の説明 Microsoft Business Solutions CRM ソフトウェア修正プログラムと更新プログラム パッケージの用語の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を表示します。
887283 Microsoft Business Solutions CRM ソフトウェア修正プログラムと更新プログラム パッケージの名前付け標準