【问题标题】:Why does CloudTable.ExecuteQuerySegmentedAsync returns only a fraction of max 1k entities?为什么 CloudTable.ExecuteQuerySegmentedAsync 只返回最大 1k 个实体的一小部分?
【发布时间】:2019-08-29 19:18:22
【问题描述】:

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

1.在PartitionKeyRowKey 上查询实体,偶尔还会进行额外过滤
2.处理结果段
3.重复这个直到continuationtoken== null

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

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

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

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

【问题讨论】:

    标签: c# .net-core azure-storage azure-table-storage


    【解决方案1】:

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

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

    来自link

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

    【讨论】:

    • 谢谢!好点,可能是问题所在。只需对完全相同的查询进行计时,获取一个段通常需要大约 300-400 毫秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多