Dynamics 365 CE中AsyncOperationBase表记录太多,影响系统性能怎么办?

微软动态CRM专家罗勇 ,回复311或者20190311可方便获取本文,同时能够在第一间获得我发布的最新博文信息,follow me!个人网站是 www.luoyong.me 。html

本文主要是根据微软官方2018年4月17日更新的知识文章 Performance is slow if the AsyncOperationBase table becomes too large in Microsoft Dynamics CRM 而写,原文是英文的,我就摘取其部份内容,加入本身的理解简述下,更加具体的请参考原文。本人不对参考本文后执行的操做而致使的任何后果承担任何责任或者连带责任,且看,且珍惜。数据库

假若这个表记录太多,好比过千万条,极可能影响整个Dynamics 365 Customer Engagement的性能,为了快速删除,这里提供了SQL进行删除的方法,对于Dynamics 365 Customer Engagement 本地部署版本(On-Premise),本身根据这个知识文章进行操做就能够,如果Dynamics 365 Customer Engagement Online,能够开个Case给微软客户服务技术支持中心请他们来执行。固然啦,你还能够本身写个程序,其多个线程来利用ExecuteMultipleRequest消息删除这个实体中的记录。异步

这里讲一下SQL删除的方法,这个方法比本身写程序调用消息来删除要快不少。async

执行前的准备工做:ide

1. 先执行以下的T-SQL脚本添加索引。工具

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

2.中止名称为 Microsoft Dynamics 365 异步处理服务 (英文名称为Microsoft Dynamics CRM Asynchronous Processing Service)的异步服务,非必须。性能

3.若是可能更改数据库的恢复模式(Recovery model)为简单(Simple),这样能减小写入的数据库日志。右击数据库,选择属性,更改以下:生产环境不要作这个步骤网站

 

而后就到了真正执行的时候了,执行以下的T-SQL脚本:spa

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

说明:Opertaion Type的说明以下:插件

  • Workflow Expansion Task (1)
  • Collect SQM data (9)
  • PersistMatchCode (12)
  • FullTextCatalogIndex (25)
  • UpdateContractStates (27)
  • Workflow (10)

执行完毕后,也有些收尾工做,以下:

1. 建议删除以前临时增长的索引(原文未提到此步骤,个人建议是恢复原状):

Drop INDEX dbo.WorkflowLogBase.CRM_WorkflowLog_AsyncOperationID; GO 

Drop INDEX dbo.DuplicateRecordBase.CRM_DuplicateRecord_AsyncOperationID; GO

Drop INDEX dbo.BulkDeleteOperationBase.CRM_BulkDeleteOperation_AsyncOperationID; GO

2. 使用T-SQL更新下表的统计信息:

UPDATE STATISTICS [dbo].[AsyncOperationBase] WITH FULLSCAN UPDATE STATISTICS [dbo].[DuplicateRecordBase] WITH FULLSCAN UPDATE STATISTICS [dbo].[BulkDeleteOperationBase] WITH FULLSCAN --下面这个表在Dynamcis 365 Customer Engagement中不存在 --UPDATE STATISTICS [dbo].[WorkflowCompletedScopeBase] WITH FULLSCAN
UPDATE STATISTICS [dbo].[WorkflowLogBase] WITH FULLSCAN UPDATE STATISTICS [dbo].[WorkflowWaitSubscriptionBase] WITH FULLSCAN

 3. 如有更改数据库的恢复模式,请恢复原状。

值得提醒你们注意的是,部署到生产环境的工做流应该选择 【自动删除已完成的工做流做业(以节省磁盘空间)】,部署到生产环境的SDK插件步骤要选择【Delete AsyncOperation if StatusCode = Successful】。固然啦,也没有必要一个个手工去看,我本身写了个工具能够检查出来没有选择的,请参考个人文章:Dynamics 365检查工做流、SDK插件步骤是否选中运行成功后自动删除系统做业记录 

原文出处:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_performance_is_slow_if_the_asyncoperationbase_table_becomes_too_large.html

相关文章
相关标签/搜索