Friday, February 10, 2017

Microsoft Dynamics CRM On-Premise Performance Testing


My colleague Eric Regnier has done some great work on CRM Performance Testing and would like to share what he shared with me….

For SQL Server indexing and tuning:

  1. Query Tuning:
  2. Understanding and resolving Microsoft SQL Server blocking:
  3. Optimizing Microsoft SQL Server Performance:
  4. SQL Server Clustered Indexing Best Practices:
  5. Improving SQL Server Performance:

CRM SDK call. i.e. when you do Data Migration jobs. Some of those might or might not increase perf:

  1. Leverage ExecuteTransactionRequest as much as possible for dependent records otherwise use ExecuteMultipleRequest
  2. Generate GUIDs of parent records within console instead letting CRM generate the GUIDs. This way will allow the script to create parent and child records in one transaction and reduce the complexity to O(n).
  3. Increase multiple request batch size to 2000 instead of 800. Requires PowerShell Should be put back to 1000 afterwards.
  4. Split console by entities. One Console per entity. I was able to achieve over 500000 per hour in a previous project with that way.
  5. Set the regarding field of the email once all emails were created in the system. 1st create emails then 2nd update Regarding
  6. Turn off database replication during DM


  1. Run the CRM Diag tool: <CRMUrl>/tools/diagnostics/diag.aspx

Web Server(s):

1. Only single Async CRM Server is running. Should be able to increase performance by having multiple async servers.

2. Enable the EnableRetrieveMultipleOptimization registry key

3. WCF Compression enabled

4. CRM SSL enabled

5. IIS Dynamic Compression is enabled

6. IIS system.web\caching\outputCaching omitVaryStar setting enabled (

7. AsyncOperationBase is truncated/cleared?

8. Anti-virus excludes CRM or disabled

9. F5 load balancer compression enabled


  1. Review Parental and Cascade All entity relationships settings for entities.
  2. Review the usage of Sharing. In custom workflow activities and plugins.
  3. Sharing with previous owner system setting off
  4. Disable workflow job retention logs from processes and plugins. This will help reduce the asyncoperation table.
  5. Review Business Rule scope configuration that are set to Entity. These will trigger at platform level.
  6. Review CRM traces and all frontend and backend servers:
    1. Sandbox logs and server level logs. Recommendation: Set at Errors only.
  7. Purge and review log configuration:
    1. Custom log entities and custom logs (e.g. NLog)
    2. Custom staging entities
    3. asyncoperation table
  8. Review audit settings. Only required entities and fields.
  9. Review Find Columns of Quick Find Views. Recommendation: max 10 fields per entities
  10. Review plugins on Retrieve if applicable
  11. Review form load performance with CRM Performance Center (CTRL+Shift+Q). Recommendation
    1. Tabs collapsed by default will increase load time
    2. No BPF. BPF take a lot of time to load
    3. Use subgrid when necessary and leverage associated grids in navigation instead.

Articles: à