zoukankan      html  css  js  c++  java
  • Dynamics 365 CE中AsyncOperationBase表记录太多,影响系统性能怎么办?

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

    本文主要是根据微软官方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删除的方法,这个方法比自己写程序调用消息来删除要快很多。

    执行前的准备工作:

    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脚本:

    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插件步骤是否选中运行成功后自动删除系统作业记录 

  • 相关阅读:
    window screen (获取屏幕信息)
    setTimeout 与 setInterval
    php 安装程序
    字符串string 对象发的应用
    数组 array 的方法使用
    angular js h5关于表单验证的例子
    angularjs 路由的应用
    勾选复选框按钮可用否则不可用
    h5正则验证表单
    常见的正则表达式
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_performance_is_slow_if_the_asyncoperationbase_table_becomes_too_large.html
Copyright © 2011-2022 走看看