带扩展的 Dynamics CRM 365 Odata 查询性能不佳

Dynamics CRM 365 Odata query with expand has poor performance

我们正在查询一个带有如下 odata 字符串的实体:

https://myinstance.crm99.dynamics.com/api/data/v9.0/myentity?$expand=my_field1_ref($select=field1,field2),my_field2_ref,my_field3_ref($select=field1, field2, field3),...&$orderby=createdon+desc&$filter=_my_entity2_ref_value+eq+696f0125-d1cf-e813-a95f-000d3ab490f3+and+statecode+ne+1

这个查询总共有 7 个连接,return大约有 1000 行。 执行需要 16 秒和 190 秒,用于 chrome 中的下载。它正在使用“myentity”中的所有字段。

在扩展之前添加 $select 部分时,仅列出的字段被 returned,执行时间减少到 11 秒,chrome 中的下载仅需 48 秒.

最后我将查询更改为 return 只有 id 而不是连接。然后包括下载在内的执行时间减少到 170 ms.

谁能解释为什么联接的性能如此差?由于添加连接是 SQL 服务器中的标准,使用连接似乎很明显,因为它应该很快。

一些在线搜索结果来自 SAP 支持、ASP.NET 核心等,它们讨论了相同的 OData 扩展性能限制。这意味着此问题不仅限于 Dynamics odata web api。与 SQL 连接不同,使用 expand 连接实体的查询将组成更多的子查询,因此性能下降。

我建议您针对您需要的相同条件构建 FetchXML 查询,并且可以使用 Web api 端点进行查询。由于本机平台支持,这应该是有效的。 Read more

https://[Organization URI]/api/data/v9.0/contacts?fetchXml=<encoded query>

您可以在 CRM 和 download the fetchXML query 中编写高级查找查询。或者写在XrmToolBox fetchxml builder.