我们正在使用.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();
答案 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的客户端决定是否要使用相同的参数继续搜索+继续令牌或修改他们的搜索以重新开始。