首页 > 解决方案 > 为什么 CloudTable.ExecuteQuerySegmentedAsync 只返回最大 1k 个实体的一小部分?

问题描述

由于我们有一个使用投影的事件源系统,我们经常需要查询我们的事件存储以获取大量实体来(重新)构建我们的状态。这是通过以下方式完成的:

1.查询实体PartitionKeyRowKey偶尔进行额外过滤
2.处理结果段
3.重复此操作直到continuationtoken== null

由 Azure Function (V2) Windows.Azure.Storage 9.3.1 运行。

我们遇到的问题是返回的段ExecuteQuerySegmentedAsync的大小从大约 200~ 到 700~ 个实体不等。我能够通过一个简单的查询来重现这一点PartitionKey,而无需额外的过滤。看:

在此处输入图像描述

文档状态ExecuteQuerySegmentedAsync最多可以返回 1k 个实体。关于我们为什么没有达到这个数字的任何想法?它将(预期)显着提高性能。

更新:未达到 5 秒的最大查询时间,获取一个段大约需要 200-300 毫秒。

标签: c#.net-coreazure-storageazure-table-storage

解决方案


文档状态 ExecuteQuerySegmentedAsync 最多可以返回 1k 个实体。关于我们为什么没有达到这个数字的任何想法?

对表的每个查询最多允许执行 5 秒。在这 5 秒过去后,表服务将返回它能够根据查询找到的尽可能多的实体(最多 1000 个实体)。很可能在这 5 秒内没有找到实体,在这种情况下,它将返回零个实体和延续令牌。

从此link

针对表服务的查询一次最多可以返回 1,000 个实体,并且最多可以执行 5 秒。如果结果集包含超过 1,000 个实体,如果查询未在 5 秒内完成,或者如果查询跨越分区边界,则响应包括包含一组延续令牌的自定义标头。继续令牌可用于构造对下一页数据的后续请求。有关延续令牌的更多信息,请参阅查询超时和分页。


推荐阅读