记一次Dynamics CRM Audit 查询失败的问题。

客户环境现象:由于业务逻辑需要使用RetrieveAuditDetailRequest API查询相关Record的详细更改信息。但查询过程中偶尔会出现失败的情况,出错原因提示是

System.TimeoutException: 'The request channel timed out while waiting for a reply after 00:01:59.9929956. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.'

很明显,超时了。

那么为什么会出现超时呢?

第一感觉:会不会是因为Audit表被占用了,导致长时间等待出现超时的呢?但经过通过sp_who2排查后发现并没有block的sql。

那会不是是因为网络原因导致的呢?随后使用内网在页面上打开Record的Audit时同样失败,排除。

看一下Audit数据量有多少吧?一看,好家伙,一千多万的数据量,10多个分区表。那会不会是因为索引重建失败导致查询过慢而失败的呢?

因为Dynamics CRM默认每天都会使用Microsoft Dynamics CRM Asynchronous Processing Service (maintenance) service 执行一次p_ReindexAll的操作。

执行时间同样默认一个表会限制在2min内,详细信息见http://soluciones-microsoft.blogspot.com/2018/07/how-to-improve-microsoft-dynamics-365.html

于是看一下job执行的记录,发现根本没有。怎么可能,继续看Config DB中是不是有人动过执行maintenance的schedule,

Select NextRunTime,RecurrenceStartTime,*
from MSCRM_CONFIG.dbo.ScaleGroupOrganizationMaintenanceJobs
where OperationType = 30

果真,已经被更新为不执行maintenance job了。

陷入僵局...

诶,看一下RetrieveAuditDetailRequest内部都会干些什么吧。于是本地环境使用Sql Server Profile抓了下Sql语句,嘿嘿,这货竟然会这样实现:

1、通过Audit Id将AuditBase表中的数据查询出来。

2、通过Audit 中的Object Id将Record数据查出来。

3、通过Audit 中的ChangeData将所有ChangeData中的Id每一个组成一条sql查询出来。

重点在#3,我们一个ChangeData中的Id足足有几万条诶。终于找到具体原因了,大量的sql语句导致查询时间过长而timeout。

介于时间以及整体的稳定性考虑,暂时将连接Dynamics的OrganizationServiceProxy中的Timeout Property设置为30分钟解决。

但是这么做并不能治本,因为页面上的Audit依然会有问题,这该如何解决?客户数据是万万不能删除的。如果有大神知道,麻烦评论区告知,感激~~

Dynamics CRM Audit Performance Troubleshooting的更多相关文章

  1. Microsoft Dynamics CRM 2015 and Microsoft Dynamics CRM 2016 Performance and Scalability Documentation

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

  2. Dynamics CRM Performance Issue when CRM Forms Opening

    事情发生在Dynamics CRM 8.2.2版本,客户新升级到这个版本几个月的时间. 突然有一天,客户反映为什么我们打开CRM Form页面的时候loading的时间这么长呢?大概会需要5-15分钟 ...

  3. 在VM虚拟机上安装Microsoft Dynamics CRM 2016 步骤图解及安装注意事项

    安装Dynamics CRM 2016环境配置要求: 系统版本:Windows Server 2012 R2(必须) SQL 版本: SQLServer2014SP1-FullSlipstream-x ...

  4. 利用Azure虚拟机安装Dynamics CRM 2016实例

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复181或者20151215可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! Dynamics CRM Ser ...

  5. Microsoft Dynamics CRM 2011 安装完全教程

    作者:卞功鑫,转载请保留.http://www.cnblogs.com/BinBinGo/p/4302612.html 环境介绍 WINDOWS 2008 R2 Datacenter Microsof ...

  6. Dynamics CRM early binding and late binding

    The key advantage of late bound entity classes is that customer entities and attributes not avaliabl ...

  7. Dynamics CRM 2016 Web API 消息列表

    Function Name Description CalculateTotalTimeIncident Function Calculates the total time, in minutes, ...

  8. Dynamics CRM 在表单上显示更改历史记录(审核历史记录)

    前言 虽然Dynamics CRM自带的审计很好,但是对于缺乏使用CRM经验的用户来说,自带的UCI界面实在是太隐藏了: 于是乎就出现了需求:想通过在表单上直接看到看审计历史记录: 在网上搜索了很多中 ...

  9. Dynamics CRM 2015-超大Solution导入问题

    我们在将比较大的solution导入CRM的时候,经常会遇到超时的问题,这是因为CRM的本身的优化限制导致的,那么如何解决呢? 官方已经有了解决方案了. 在浏览完两种解决方法之后,我们要知道的是: 1 ...

随机推荐

  1. 关于MYSQL的查询时间段、删除数据、查询目标行的命令用法。

    Q1.第一次工作写命令时,写了一个把一个表的数据插入到另一个表中,运行时命令长时间处于执行状态. A.第一次处理数据库大量数据,长时间按运行属于正常现象,这与学校中的小数据不同. Q2.如何查询数据库 ...

  2. 获取ul下面最后一个li或ul中有多少个li

    获取ul下面最后一个li或ul中有多少个li 先获取ul的对象,再通过这个对象获取li的list用for循环取值text之类的 def set_city(self, base_info): quali ...

  3. 安装mysql报错:遇到缺少vcruntime140_1.dll文件

    把vcruntime140_1.dll文件放到System32 ,和System64就行 文件地址为:C:\Windows\System32 直接百度下载放进去就行

  4. 动力节点 mysql 郭鑫 34道经典的面试题二

    13.有3个表S(学生表),C(课程表),SC(学生选课表) S(SNO,SNAME)代表(学号,姓名) C(CNO,CNAME,CTEACHER)代表(课号,课名,教师) SC(SNO,CNO,SC ...

  5. 使用json-server与Mockjs搭建模拟服务

    为什么使用 在项目开发中,常常需要边写前端页面边写后端接口,但是后端接口服务往往是滞后于前端开发的,或者是不能及时提供的.出于前端开发的迅速和便捷去考虑,我们可以根据后端接口数据结构去模拟(mock) ...

  6. Python3-logging模块-日志记录

    Python3中的logging模块提供了较为灵活的事件日志系统 日志级别 DEBUG < INFO < WARING(Python默认) < ERROR < FATAL(CR ...

  7. 深入解读Dictionary

    Dictionary<TKey,TValue>是日常.net开发中最常用的数据类型之一,基本上遇到键值对类型的数据时第一反应就是使用这种散列表.散列表特别适合快速查找操作,查找的效率是常数 ...

  8. SpringBoot--防止重复提交(锁机制---本地锁、分布式锁)

    防止重复提交,主要是使用锁的形式来处理,如果是单机部署,可以使用本地缓存锁(Guava)即可,如果是分布式部署,则需要使用分布式锁(可以使用zk分布式锁或者redis分布式锁),本文的分布式锁以red ...

  9. Python HTTP Server (Simples)

    Simple HTTP Server 适合临时开发调试web 使用, 直接当前项目下使用python命令快速起一个http server python2 python -m SimpleHTTPSer ...

  10. MongoDB副本集replica set(三)--添加删除成员

    在上一篇文章中,我们搭建了3个节点的副本集,集群信息如下: rstest:PRIMARY> rs.config() { "_id" : "rstest", ...