c# - 提高使用 CreateDocumentQuery 和 ExecuteNextAsync 时的性能
问题描述
当我直接在 Azure 门户的数据资源管理器中运行以下查询时,大约需要 2 秒才能完成。使用 DocumentDB SDK 运行相同的查询大约需要 1 分钟才能完成。为什么两种方法的性能差距如此之大?如何使用 SDK 实现相同的性能?
从 c 中选择不同的 c.docId,其中 c.documentType = 'Article' 和 LOWER(c.userId) = 'someone' 和 c.docId in (812,838,901,1557,1558,1372,1367,1592,1081,1590,1364,第1441章)
我们使用的代码:
公共异步任务> GetItemsAsync(字符串表达式,int pageSize = -1,字符串 continueToken = null) { 使用 (var bench = new Benchmark(expr)) { var queryable = _Client.CreateDocumentQuery(UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId) , 表达式 , 新 FeedOptions { MaxItemCount = pageSize, RequestContinuation = continueToken, EnableCrossPartitionQuery = true }) .AsDocumentQuery(); 列表结果 = new List(); 而(可查询。HasMoreResults) { var queryResult = await queryable.ExecuteNextAsync(); 结果.AddRange(queryResult); } 返回结果; } }
我们使用包 Microsoft.Azure.DocumentDB.2.11.2。_Client 使用 ConnectionMode.Direct 和 Protocol.Tcp 打开
请求诊断字符串:
QueryMetrics:分区 0 检索到的文档数:1,847 检索到的文档大小:1,166,051 字节 输出文档数:0 输出文件大小:49 字节 指数利用率:0.00 % 使用的索引 潜在指标 总查询执行时间:21.20 毫秒 查询准备时间 查询编译时间:0.22 毫秒 逻辑计划构建时间:0.22 毫秒 物理计划构建时间:0.12 毫秒 查询优化时间:0.01 毫秒 索引查找时间:0.87 毫秒 文件加载时间:13.38 毫秒 运行时执行时间 查询引擎时间:5.68 毫秒 系统功能执行时间:1.35毫秒 用户自定义函数执行时间:0.00毫秒 文档写入时间:0.00 毫秒 客户端指标 重试次数:0 请求费用:74.85 RU 分区执行时间线 ┌────────────┬──────────────────────────────────── ┬────────────────┬──────────────┬───────────────── ─┬───────────────────┬────────────┐ │Partition Id│Activity Id │开始时间(UTC)│结束时间(UTC)│持续时间(ms)│文档数│重试次数│ ├────────────┼──────────────────────────────────── ┼────────────────┼──────────────┼──────────────── ─┼─────────────────────┼────────────┤ │ 0│54693cfe-843d-404b-82da-446347d5a71f│ 02:11:28.1185Z│02:11:28.3639Z│ 245.38│ 0│ 0│ └────────────┴──────────────────────────────────── ┴────────────────┴──────────────┴───────────────── ─┴───────────────────┴────────────┘ 调度指标 ┌────────────┬──────────────────────┬─────────────── ──────┬────────────────────┬────────────────────┬── ────────────────────┐ │Partition Id│响应时间(ms)│运行时间(ms)│等待时间(ms)│周转时间(ms)│抢占次数│ ├────────────┼────────────────────┼────────────── ──────┼────────────────────┼────────────────────┼── ────────────────────┤ │ 0│ 84.02│ 245.38│ 106.94│ 352.32│ 1│ └────────────┴──────────────────────┴─────────────── ──────┴────────────────────┴────────────────────┴── ────────────────────┘ 客户端请求统计:{ 0:[ RequestStartTime:2020-07-25T02:11:28.3895792Z,RequestEndTime:2020-07-25T02:11:28.3895792Z,尝试的区域数:1 ]} == QueryMetrics:分区 21 检索到的文档数:21,747 检索到的文档大小:14,783,785 字节 输出文件数:7 输出文件大小:171 字节 指数利用率:0.00 % 使用的索引 潜在指标 总查询执行时间:187.95 毫秒 查询准备时间 查询编译时间:1.10 毫秒 逻辑计划构建时间:1.83 毫秒 物理计划构建时间:0.17 毫秒 查询优化时间:0.01 毫秒 索引查找时间:1.99 毫秒 文档加载时间:123.47 毫秒 运行时执行时间 查询引擎时间:52.73 毫秒 系统功能执行时间:11.06毫秒 用户自定义函数执行时间:0.00毫秒 文档写入时间:0.01 毫秒 客户端指标 重试次数:0 请求费用:849.38 RU 分区执行时间线 ┌────────────┬──────────────────────────────────── ┬────────────────┬──────────────┬───────────────── ─┬───────────────────┬────────────┐ │Partition Id│Activity Id │开始时间(UTC)│结束时间(UTC)│持续时间(ms)│文档数│重试次数│ ├────────────┼──────────────────────────────────── ┼────────────────┼──────────────┼──────────────── ─┼─────────────────────┼────────────┤ │ 21│e0745d8f-ec34-4a40-9dac-556ffc8e8603│ 02:16:14.5334Z│02:16:14.8970Z│ 363.53│ 7│ 0│ └────────────┴──────────────────────────────────── ┴────────────────┴──────────────┴───────────────── ─┴───────────────────┴────────────┘ 调度指标 ┌────────────┬──────────────────────┬─────────────── ──────┬────────────────────┬────────────────────┬── ────────────────────┐ │Partition Id│响应时间(ms)│运行时间(ms)│等待时间(ms)│周转时间(ms)│抢占次数│ ├────────────┼────────────────────┼────────────── ──────┼────────────────────┼────────────────────┼── ────────────────────┤ │ 21│ 54314.14│ 363.53│ 54314.22│ 54677.76│ 1│ └────────────┴──────────────────────┴─────────────── ──────┴────────────────────┴────────────────────┴── ────────────────────┘ 客户端请求统计:{ 21:[ RequestStartTime:2020-07-25T02:16:14.8967387Z,RequestEndTime:2020-07-25T02:16:14.8967387Z,尝试的区域数:1 ]} == QueryMetrics:分区 20 检索到的文档数:44,693 检索到的文档大小:30,777,951 字节 输出文件数:9 输出文件大小:256 字节 指数利用率:0.00 % 使用的索引 潜在指标 总查询执行时间:434.05 毫秒 查询准备时间 查询编译时间:2.37 毫秒 逻辑计划构建时间:4.01 毫秒 物理计划构建时间:0.46 毫秒 查询优化时间:0.04 毫秒 索引查找时间:2.61 毫秒 文档加载时间:283.05 毫秒 运行时执行时间 查询引擎时间:126.52 毫秒 系统功能执行时间:23.76毫秒 用户自定义函数执行时间:0.00毫秒 文档写入时间:0.02 毫秒 客户端指标 重试次数:0 请求费用:1,740.93 RU 分区执行时间线 ┌────────────┬──────────────────────────────────── ┬────────────────┬──────────────┬───────────────── ─┬───────────────────┬────────────┐ │Partition Id│Activity Id │开始时间(UTC)│结束时间(UTC)│持续时间(ms)│文档数│重试次数│ ├────────────┼──────────────────────────────────── ┼────────────────┼──────────────┼──────────────── ─┼─────────────────────┼────────────┤ │ 20│5b5045a4-613d-408e-9d94-d44fd7a8e5d3│ 02:16:13.8872Z│02:16:14.3596Z│ 472.41│ 5│ 0│ │ 20│45c14bfb-f9bf-48f8-ab0d-7680f7aeac99│ 02:16:14.3602Z│02:16:14.5278Z│ 167.61│ 4│ 0│ └────────────┴──────────────────────────────────── ┴────────────────┴──────────────┴───────────────── ─┴───────────────────┴────────────┘ 调度指标 ┌────────────┬──────────────────────┬─────────────── ──────┬────────────────────┬────────────────────┬── ────────────────────┐ │Partition Id│响应时间(ms)│运行时间(ms)│等待时间(ms)│周转时间(ms)│抢占次数│ ├────────────┼────────────────────┼────────────── ──────┼────────────────────┼────────────────────┼── ────────────────────┤ │ 20│ 53667.87│ 640.03│ 53668.52│ 54308.55│ 2│ └────────────┴──────────────────────┴─────────────── ──────┴────────────────────┴────────────────────┴── ────────────────────┘ 客户端请求统计:{ 20:[ RequestStartTime:2020-07-25T02:16:14.3599211Z,RequestEndTime:2020-07-25T02:16:14.3599211Z,尝试的区域数:1 , RequestStartTime:2020-07-25T02:16:14.5274725Z,RequestEndTime:2020-07-25T02:16:14.5274725Z,尝试的区域数:1 ]}
解决方案
附加的诊断信息似乎表明您正在执行跨分区查询(似乎要访问 3 个分区来获取查询结果),您可以在每个分区统计信息中看到“运行时间”(245 毫秒、363 毫秒、640 毫秒) .
高数字似乎是由于结果数量也多(其中一个查询为 44K)。
我们不知道您正在执行哪种类型的查询,但它看起来确实像扫描(参考)。这似乎与您的使用一致LOWER
(另请参见Index Utilization: 0.00 %
您的诊断)。
另一个有用的链接是调整查询性能的指南,它有一些很好的提示(请参阅链接以获取解释:
- 设置
MaxItemCount
为-1
- 设置
MaxDegreeOfParallelism
为-1
但总的来说,问题似乎在于由于使用LOWER
.
推荐阅读
- node.js - NODE 和 SQL Server 事务实现
- node.js - 如何满足以下 Nodejs 单元测试中的测试覆盖率?
- html - HTML/CSS 和 svg
- python - 仅连续日期的累计金额
- python-3.x - ModuleNotFoundError:没有名为“pony.orm.dbproviders”的模块
- javascript - 如何在事件中使用反应钩子
- curl - 如何从 Apache Solr 中的 attr_text 中删除所有“\n”?
- algorithm - 可视化 4D 转置
- sql - 消除列中的每个重复值
- html - 在css中创建具有特定形状的对话气泡时,在后面设置透明度