Azure Table Storage API使用Continuation Token返回0结果

时间:2016-02-15 06:05:24

标签: azure azure-storage

我们正在使用.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();

1 个答案:

答案 0 :(得分:4)

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

  

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

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

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

让我试一试关于Partition Bounday所理解的内容。假设你的表中有100万行均匀分布在10个分区中(我们假设你的PartitionKeys是001,002,003,... 010)。现在我们知道Azure Tables中的数据是由PartitionKey组织的,然后是Partition by RowKey。由于在您的查询中没有指定PartitionKey,因此Table Service从1st Partition(即PartitionKey == 001)开始,并尝试在那里找到匹配的数据。如果它没有在该分区中找到任何数据,它不知道数据是否存在于另一个分区中,因此它不会转到下一个分区,而只是返回一个延续令牌并将其留给使用API​​的客户端决定是否要使用相同的参数继续搜索+继续令牌或修改他们的搜索以重新开始。