从插件中调用ExecuteMultipleRequest是否有益?

Dar*_*ryl 6 dynamics-crm-2011 dynamics-crm-2013 dynamics-crm-2015

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

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

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

Dar*_*ryl 9

所以我做了我以前应该做的事情,并且刚刚创建了一个插件来测试它.这是在我的本地虚拟机上运行CRM 2013(预操作),因此结果会有所不同,但我看到普通的创建每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));
    }
}
Run Code Online (Sandbox Code Playgroud)

注册了插件并运行了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 |
+------------------+---------------+-------+
Run Code Online (Sandbox Code Playgroud)

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

Update 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 |
+------------------+----------+--------+
Run Code Online (Sandbox Code Playgroud)

有趣的是,记录10倍的时间大约是25倍,但差异只有12倍.(尝试进行更新而不是删除,但我一直在获取超时错误,即使每个只有一个...一定是在创建某种无限循环,只是不确定是什么......)

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