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

标签 dynamics-crm-2011 dynamics-crm-2013 dynamics-crm-2015

我知道 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/

相关文章:

javascript - 如何使用依赖选项集过滤查找?

c# - 如何在特定的 jwt 上下文下发出 post 请求 webclient

javascript - window.open 来自 CRM 2011 的 silverlight

dynamics-crm - CRM 2011 Workflow 中的一项事件应该只有一个所有者方

c# - CRM 2011 LINQ : Invalid ‘where’ condition. 实体成员正在调用无效的属性或方法

javascript - 更改服务日历中的选定行 [CRM2013]

javascript - JavaScript 不调用函数

dynamics-crm-2011 - 属性 'stageid' 属于无法识别的 EdmPropertyKind。实体 new_test 具有重复的导航属性名称

c#-4.0 - 如何将类的属性转换为参数?

dynamics-crm - 无法在 CRM 2015 的 SSRS 报告项目的数据源选项中获得 "Microsoft Dynamics CRM Fetch"