【问题标题】:Azure Table Storage API returns 0 results with Continuation TokenAzure 表存储 API 返回 0 个带有延续令牌的结果
【发布时间】:2016-02-15 06:05:23
【问题描述】:

我们正在使用 .net Azure 存储客户端库从服务器检索数据。但是当我们尝试检索数据时,结果只有 0 个带有延续标记的项目。当我们使用这个延续令牌获取下一页时,我们再次得到相同的结果。但是,当我们使用这样获取的第 4 个延续令牌时,我们会得到 15 个项目的正确结果。(所有请求的项目数为 15)。仅当我们尝试应用过滤条件时才会观察到此问题。下面给出了用于获取结果的代码

    var tableReference = _tableClient.GetTableReference(tableName);
                var query = new TableQuery();
                query.Where("'DeviceId' eq '99'"); // DeviceId is of type Int32
                query.TakeCount = 15;

    var resultsQuery = tableReference.ExecuteQuerySegmented(query, token);
                var nextToken = resultsQuery.ContinuationToken;
                var results = resultsQuery.ToList();

【问题讨论】:

    标签: azure azure-storage


    【解决方案1】:

    这是预期的行为。来自Query Timeout and Pagination

    针对表服务的查询最多可能返回 1,000 个项目 一次,最多可以执行五秒钟。如果 结果集包含超过 1,000 个项目,如果查询没有 在五秒内完成,或者如果查询跨分区 边界,响应包括为开发人员提供的标头 使用延续标记来恢复查询 结果集中的下一项。继续令牌标头可能是 为查询表操作或查询实体操作返回。

    我注意到您没有在查询中使用PartitionKey。这将导致全表扫描。建议在查询中始终使用PartitionKey(可能还有RowKey)以避免全表扫描。我强烈建议阅读 Azure Storage Table Design Guide: Designing Scalable and Performant Tables 以充分利用 Azure Tables。

    更新:解释“如果查询跨越分区边界”

    让我举一个例子来说明我对分区边界的理解。假设您的表中有 100 万行均匀分布在 10 个分区中(假设您的 PartitionKey 为 001、002、003、...010)。现在我们知道 Azure Tables 中的数据是按 PartitionKey 组织的,然后按 RowKey 组织在一个 Partition 中。由于在您的查询中您没有指定 PartitionKey,因此表服务从第一个分区(即 PartitionKey == 001)开始并尝试在那里找到匹配的数据。如果它在该分区中没有找到任何数据,则它不知道数据是否存在于另一个分区中,因此它不会转到下一个分区,而是简单地返回一个延续令牌并将其留给使用 API 的客户端决定他们是要使用相同的参数 + 继续标记继续搜索还是修改搜索以重新开始。

    【讨论】:

    • 您能否解释一下“如果查询跨越分区边界”这个术语。仅在某些设备 ID 上才会出现此问题。
    • 更新了我的答案。 HTH。
    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多