gpt4 book ai didi

dynamics-crm-2011 - 从插件内部调用 ExecuteMultipleRequest 有用吗?

转载 作者:行者123 更新时间:2023-12-04 07:47:30 25 4
gpt4 key购买 nike

我知道 ExecuteMultipleRequest从 CRM 外部执行批量更新时,这是一个巨大的性能助推器。我不知道从 CRM 插件中调用它是否有益。

我目前的理解是,使用 ExecuteMultipleRequest 的主要性能增益在于实际的 SOAP 消息传递成本。因此(为了更新 5000 条记录)而不是发送 5000 条单独的 Soap 消息(每条都必须被序列化、验证、传输等),所有这些消息都必须发送到服务器,您可以只发送一条包含 5000 条记录的消息。但是当从插件调用时,您已经在服务器上,因此不必进行 SOAP 调用,因此使用它没有任何好处。

还有其他一些我没有看到的潜在好处吗?

最佳答案

所以我做了我之前应该做的事情,只是创建了一个插件来测试这个。这是在我的本地 VM(预操作)上的 CRM 2013 上运行的,因此结果可能会有所不同,但我看到普通的旧 Create 每 100 个实体减少约 290 毫秒

我首先创建了这个插件

public class ExecuteMultipleTester : PluginBase
{
protected override void ExecuteInternal(Common.Plugin.LocalPluginContext pluginContext)
{
var watch = new Stopwatch();
var service = pluginContext.OrganizationService;

watch.Start();
var request = new ExecuteMultipleRequest
{
Settings = new ExecuteMultipleSettings
{
ContinueOnError = false,
ReturnResponses = false,
},
Requests = new OrganizationRequestCollection()
};

for (var i = 0; i < 100; i++)
{
request.Requests.Add(new CreateRequest
{
Target = new new_Year
{
new_Year = i + "- B",
new_YearIntValue = i,
}
});
}
service.Execute(request);
watch.Stop();

var multipleCreate = watch.ElapsedMilliseconds;

watch.Restart();
for(var i = 0; i < 100; i++)
{
service.Create(new new_Year
{
new_Year = i + "- A",
new_YearIntValue = i,
});
}
watch.Stop();

throw new InvalidPluginExecutionException(String.Format("ExecuteMultipleRequest Time was: {0}ms, Standard was: {1}ms", multipleCreate, watch.ElapsedMilliseconds));
}
}

注册了插件并运行了 10 个测试。这是结果(ASCII 表,哦耶!):
+------------------+---------------+-------+
| 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 |
+------------------+---------------+-------+

因此,从这些结果来看,不需要从插件中执行 ExecuteMultipleRequest。您已经在服务器上,必须执行更多代码才能执行相同的操作。

更新 1 - 1000 创建针对完整环境的测试

我再次运行此测试以创建 1000 条记录,并在一个完全成熟的环境中运行 SQL、服务和 Web 的单独框。非常相似的结果(只运行了 5 次测试,因为它需要更长的时间)
+------------------+----------+--------+
| Execute Multiple | Standard | Diff |
+------------------+----------+--------+
| 18922 | 15057 | 3865 |
| 18668 | 14946 | 3722 |
| 18162 | 14773 | 3389 |
| 19059 | 14925 | 4134 |
| 18334 | 15306 | 3028 |
+------------------+----------+--------+
| | Average | 3627.6 |
+------------------+----------+--------+

有趣的是,对于 10 倍多的记录,时间大约要长 25 倍,但差异仅为 12 倍。 (尝试进行更新而不是删除,但我不断收到超时错误,即使每个错误只有一个......一定是在创建某种无限循环,只是不确定......)

对于 1000 个创建,它几乎慢了 4 秒。我不会在我的插件中使用它...

关于dynamics-crm-2011 - 从插件内部调用 ExecuteMultipleRequest 有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28414718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com