Dynamics crm 2011 从插件中调用ExecuteMultipleRequest是否有益?
我知道,当从CRM外部执行批量更新时,是一个巨大的性能提升器。我不知道从CRM插件中调用它是否有益 我目前的理解是,使用ExecuteMultipleRequest获得的主要性能收益是实际的SOAP消息传递成本。因此(为了更新5000条记录),您可以只发送一条包含5000条记录的消息,而不是发送5000条单独的Soap消息(每条消息都必须被序列化、验证、传输等)。但是当从插件调用时,您已经在服务器上,因此不需要进行SOAP调用,因此使用它没有任何好处Dynamics crm 2011 从插件中调用ExecuteMultipleRequest是否有益?,dynamics-crm-2011,dynamics-crm-2013,dynamics-crm-2015,Dynamics Crm 2011,Dynamics Crm 2013,Dynamics Crm 2015,我知道,当从CRM外部执行批量更新时,是一个巨大的性能提升器。我不知道从CRM插件中调用它是否有益 我目前的理解是,使用ExecuteMultipleRequest获得的主要性能收益是实际的SOAP消息传递成本。因此(为了更新5000条记录),您可以只发送一条包含5000条记录的消息,而不是发送5000条单独的Soap消息(每条消息都必须被序列化、验证、传输等)。但是当从插件调用时,您已经在服务器上,因此不需要进行SOAP调用,因此使用它没有任何好处 还有其他我没有看到的潜在好处吗?所以我做了我
还有其他我没有看到的潜在好处吗?所以我做了我以前应该做的事情,并创建了一个插件来测试这一点。这是在CRM 2013上在我的本地虚拟机上运行的(预操作),因此结果可能会有所不同,但我看到普通的旧创建每100个实体减少约290ms 我首先创建了这个插件
公共类ExecuteMultipleTester:插件库
{
受保护的覆盖void ExecuteInternal(Common.Plugin.localpluginotext pluginotext)
{
var watch=新秒表();
var service=pluginotext.OrganizationService;
watch.Start();
var request=新的ExecuteMultipleRequest
{
设置=新的ExecuteMultipleSettings
{
ContinueOnError=false,
ReturnResponses=false,
},
请求=新的OrganizationRequestCollection()
};
对于(变量i=0;i<100;i++)
{
request.Requests.Add(新建CreateRequest
{
目标=新的一年
{
新年=i+“-B”,
new_YearIntValue=i,
}
});
}
执行(请求);
看,停;
var multipleCreate=watch.elapsedmillisons;
watch.Restart();
对于(变量i=0;i<100;i++)
{
服务。创建(新的一年)
{
新年=i+“-A”,
new_YearIntValue=i,
});
}
看,停;
抛出新的InvalidPlugineExecutionException(String.Format(“ExecuteMultipleRequest时间为:{0}毫秒,标准为:{1}毫秒”,multipleCreate,watch.ElapsedMilliseconds));
}
}
注册插件并运行了10个测试。以下是结果(ASCII表格,哦,耶!):
因此,从这些结果来看,不需要在插件中执行ExecuteMultipleRequest。您已经在服务器上,必须执行更多代码才能执行相同的操作
更新1-1000针对完整环境创建测试
为了创建1000条记录,我再次运行了这个测试,并且是在一个完整的环境中,为SQL、服务和Web设置了单独的框。非常相似的结果(只进行了5次测试,因为这需要更长的时间)
有趣的是,对于10倍以上的记录,时间大约延长了25倍,但差异仅为12倍以上。(尝试进行更新,而不是删除,但我不断收到超时错误,即使每次只有一个…一定是在创建某种无限循环,只是不确定是什么…)
对于1000辆车来说,速度要慢4秒。我不会在我的插件中使用它…这些类型的结果与我在一体机上运行测试时看到的结果一致(即CRM服务器、SQL……都包含在一台机器中)。当运行一个更传统的部署时,我看到了相反的结果。此外,随着更多的消息添加到您的请求中,差距也会显著扩大。考虑将循环增加到进程300, 500或1000(默认为执行Excel MultIpRerErrQuestMax),并将一个将CRM前端、CRM ASYNC和SQL Server分离到不同的盒子上的部署运行。 < P>我知道这是一个老问题/答案,但自从我在研究中发现了这一点,我想我也应该加入我在MSDN上找到的一些信息: 限制并发调用–适用于Microsoft Dynamics 365(联机) 每次执行的并发执行次数限制为2次 组织机构。如果超过该限制,则会出现
服务器忙
故障
在执行第一个请求之前抛出。对于内部部署
部署时,默认情况下不启用限制
基于此,我建议在任何情况下都不要使用
ExecuteMultipleRequest
,初始数据加载场景除外uhm,假设您正在更新插件中的5000条记录,在某些情况下使用ExecuteMultipleRequest可能会在2分钟限制之前完成(现在想想可能不是个好主意。我可能会把问题改成一个工作流),是否会比5000次单独更新快?如果是,原因是什么?沙箱中的工作流具有相同的2分钟限制。关于ExecuteMultipleRequest,Microsoft在MSDNn general上写道,ExecuteMultipleRequest的行为与您单独执行输入请求集合中的每个消息请求的行为相同,但具有更好的性能性能
@GuidoPreite显然,当从客户端执行时,它应该被编辑为具有更好的性能。我的测试表明,它在插件中的运行速度较慢。如果在插件中使用,请参阅相关链接以了解其他可能的故障副作用。一个失败,它们都失败了。感谢您做了这个实验。我对答案发表了评论前几周声明在插件中使用ExecuteMultiple是没有必要的(),我一直担心我没有真正证明我所说的。现在证据已经很清楚了。我很好奇,如果你使用更多的c,是否会得到同样的结果
+------------------+---------------+-------+
| Execute Multiple | Sevice.Create | Diff |
+------------------+---------------+-------+
| 777 | 408 | 369 |
| 493 | 327 | 166 |
| 614 | 346 | 268 |
| 548 | 331 | 217 |
| 577 | 312 | 265 |
| 675 | 313 | 362 |
| 574 | 318 | 256 |
| 553 | 326 | 227 |
| 810 | 318 | 492 |
| 595 | 311 | 284 |
+------------------+---------------+-------+
| Average Diff: | 290.6 |
+------------------+---------------+-------+
+------------------+----------+--------+
| Execute Multiple | Standard | Diff |
+------------------+----------+--------+
| 18922 | 15057 | 3865 |
| 18668 | 14946 | 3722 |
| 18162 | 14773 | 3389 |
| 19059 | 14925 | 4134 |
| 18334 | 15306 | 3028 |
+------------------+----------+--------+
| | Average | 3627.6 |
+------------------+----------+--------+