Dynamics 365中部分账号使用系统明显缓慢怎么办?先这么干!
摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复263或者20170828可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me 。
项目升级到Dynamics 365以后,过了些时间,有的账号反馈使用很慢,甚至同一个地方同一台电脑用不同的账号特别是进行数据修改的时候会发现有明显的速度差别,Why?
初步的表象发现是POST 到这个请求 /AppWebServices/InlineEditWebService.asmx 比较慢,这个是系统标准的东西,就算是有问题,我们能做的可能也有限。奇怪的是我们使用同样业务部门同样角色的账号处理类似单据的时候并不能重现此问题,而且通过SQL Profiler抓取的SQL执行语句也没有发现执行时间很长的SQL。
有问题就有解决问题的方法,大神们日夜分析,发现卡顿的主要原因是执行部分SQL后会卡顿,等待然后再执行,这样导致的总体时间很长,整个过程甚至能超过20秒。再次详细分析,发现每次这个卡顿都会又一次查询 BusinessProcessflowInstanceBase 这个表,奇怪啊,我们并没有使用业务流程。后来微软技术支持中心向更加广泛的范围求助,终于找到答案,原来是Dynamics 365开始,CRM中的一条记录可能有多个活动业务流程,每个人根据其权限等显示的业务流程又不尽相同。所以会查询这个表,当然在查询这个表之前会先查询这条记录相关的MRU(Most Recently Used List,最近访问列表),但是如果这个MRU非常大,就会非常耗时导致等待。
那么这么MRU怎么看?当然你可以通过SQL直接来看,这个MUR跟用户和实体的Typecode有关,下面是查看某个用户的所有MRU:
select ueus.RecentlyViewedXml,
len(ueus.RecentlyViewedXml) as RecentlyViewedXmlLength,
sysuser.FullName,
entity.LogicalName
from UserEntityUISettings ueus
left join SystemUserBase sysuser on ueus.OwnerId = sysuser.SystemUserId
left join entity on ueus.ObjectTypeCode = entity.ObjectTypeCode
我看到我这个账号经常使用ly_test这个实体,发现其RecentlyViewedXml大小也有 8832 字节,如果你用的狠的话,这个数字可能会超过1Mb。这个里面的内容我简化下如下:
<RecentlyViewedEntityData etc="10007">
<RecentlyViewedItem>
<Type>0</Type>
<ObjectId>{5DA888D6-06A3-E611-816B-000D3A80C8B8}</ObjectId>
<EntityTypeCode>10007</EntityTypeCode>
<DisplayName>罗勇测试</DisplayName>
<Title>批量操作创建的罗勇测试记录</Title>
<Action></Action>
<IconPath></IconPath>
<PinStatus>false</PinStatus>
<ProcessInstanceId></ProcessInstanceId>
<ProcessId></ProcessId>
<LastAccessed>11/05/2016 03:20:58</LastAccessed>
</RecentlyViewedItem>
</RecentlyViewedEntityData>
怎么解决?当然你可以通过组织服务来清除这个字段的值,也可以直接用SQL来处理,比如将长度大于1000的清除:
update UserEntityUISettings
set RecentlyViewedXml=null
where len(RecentlyViewedXml)>=1000
用SQL来清除这个MRU有个弊端就是需要重启IIS,因为它在服务器端有缓存。
当然也可以写程序来清除,目前没有看到界面上提供手动清除MRU的地方:
Console.WriteLine("本程序用于清理你输入账号的最近访问记录。");
string userName = string.Empty;
string passWord = string.Empty;
Console.WriteLine("请输入登录的用户名,输入完毕后按回车键确认:");
userName = Console.ReadLine().ToString().Trim();
Console.WriteLine("请输入登录的密码,输入完毕后按回车键确认:");
while (true)
{
ConsoleKeyInfo ck = Console.ReadKey(true);
if (ck.Key != ConsoleKey.Enter)
{
if (ck.Key != ConsoleKey.Backspace)
{
passWord += ck.KeyChar.ToString();
Console.Write("*");
}
else
{
Console.Write("\b \b");
}
}
else
{
break;
}
}
ClientCredentials cc = new ClientCredentials();
cc.UserName.UserName = userName;
cc.UserName.Password = passWord;
OrganizationServiceProxy orgSvc = new OrganizationServiceProxy(new Uri("https://demo.luoyong.me/XRMServices/2011/Organization.svc"),
null, cc, null);
WhoAmIRequest whoReq = new WhoAmIRequest();
WhoAmIResponse whoRep = orgSvc.Execute(whoReq) as WhoAmIResponse;
var userEntity = orgSvc.Retrieve("systemuser", whoRep.UserId, new ColumnSet("fullname"));
Console.WriteLine(string.Format("登录成功,欢迎{0},继续操作请输入y!", userEntity.GetAttributeValue<string>("fullname")));
var input = Console.ReadLine().ToString().ToUpper();
if (input == "Y")
{
QueryExpression qe = new QueryExpression("userentityuisettings");
qe.ColumnSet = new ColumnSet("recentlyviewedxml");
qe.Criteria.AddCondition("ownerid", ConditionOperator.Equal, whoRep.UserId);
var usersettings = orgSvc.RetrieveMultiple(qe);
if (usersettings.Entities.Count >= )
{
Console.WriteLine("共找到" + usersettings.Entities.Count + "条最近访问记录!");
foreach (var item in usersettings.Entities)
{
item["recentlyviewedxml"] = null;
orgSvc.Update(item);
}
}
}
else
{
Console.WriteLine("你选择了取消操作!");
}
Console.WriteLine("程序运行完成!");
Console.ReadKey();
据我对这个MRU的观察,MRU的缓存在IIS上有缓存,用户登录会从服务器上获取缓存,本地并不是通过浏览器来缓存,会在用户退出登录时候将访问记录写入到服务器端。所以仅仅依靠程序或者SQL来清除MRU还不管用,需要配合IIS重启。
系统在这个设计上可能欠缺考虑,比如针对某个实体的MRU如果超过一定的数量采用先进先出的方法自动清除掉前面的访问记录,毕竟保存那么多也没有很大的用处,除非你要做访问记录的审核。也可以考虑再某个地方让用户自行清理。希望微软Dynamics CRM产品组早日就此问题提出根本解决方案。
Dynamics 365中部分账号使用系统明显缓慢怎么办?先这么干!的更多相关文章
- Dynamics 365中的非交互式账号(Non-interactive User)介绍
摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复272或者20180616可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...
- 自定义工作流活动报错:您无法登陆系统。原因可能是您的用户记录或您所属的业务部门在Microsoft Dynamics 365中已被禁用。
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复265或者20170926可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- Dynamics 365工作流报错:您无法登陆系统。原因可能是您的用户记录或您所属的业务部门在Microsoft Dynamics 365中已被禁用。
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复265或者20170926可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- 将Dynamics 365中的用户及其角色、角色导出到Excel中
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复240或者20161204可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- Dynamics 365中的应用程序介绍
本人微信和易信公众号:微软动态CRM专家罗勇 ,回复275或者20180630可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- Dynamics 365中开发和注册插件介绍
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- Dynamics 365中配置和使用文件夹级别的跟踪(folder-level tracking)
本人微信和易信公众号:微软动态CRM专家罗勇 ,回复274或者20180630可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- Dynamics 365中的事件框架与事件执行管道(Event execution pipeline)
本文介绍了Microsoft Dynamics 365(以下简称D365)中的两个概念,事件框架(Event Framework)与事件执行管道(Event execution pipeline). ...
- Dynamics 365中的公告(Post)分析
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
随机推荐
- 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)
定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...
- Memcached的安装与使用
这一段折腾了下Memcached,有所收获吧,记录一下. 1.什么是Memcached memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memca ...
- Java 9 揭秘(12. Process API 更新)
Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: Process API是什么 如何创建本地进程 如何获取新进程的信息 如何获取当前进程的信息 如何获取所有系统进程的信息 如何设置创建,查 ...
- Python项目实战:福布斯系列之数据采集
1 数据采集概述 开始一个数据分析项目,首先需要做的就是get到原始数据,获得原始数据的方法有多种途径.比如: 获取数据集(dataset)文件 使用爬虫采集数据 直接获得excel.csv及其他数据 ...
- 整理的 matplotlib 绘图笔记
- (转)SimpleDateFormat使用详解
1 SimpleDateFormat 介绍 public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格 ...
- mongodb中limit与skip方法
Mongodb Limit()方法 如果需要在mongodb中获取指定数量的数据记录,这时候就要用到limit()方法,该方法需要接收一个数字参数 基本语法: DB.COLLECTION_NAME. ...
- ubuntu下helloworld内核模块编译
1.hello.c #include<linux/init.h> #include<linux/module.h> MODULE_LICENSE("Dual BSD/ ...
- ES6中的模块
前面的话 JS用"共享一切"的方法加载代码,这是该语言中最容出错且容易令人感到困惑的地方.其他语言使用诸如包这样的概念来定义代码作用域,但在ES6以前,在应用程序的每一个JS中定义 ...
- CSS样式----浮动(图文详解)
标准文档流 宏观地讲,我们的web页面和photoshop等设计软件有本质的区别:web页面的制作,是个"流",必须从上而下,像"织毛衣".而设计软件,想往哪里 ...