当 Azure table 有更多记录时,ExecuteQuerySegmentedAsync 不工作

ExecuteQuerySegmentedAsync is not working when the Azure table has more records

我正在尝试从 Azure table 存储中读取记录。我在提取记录时有一个简单的查询

var isPagination = true;
var  combinedFilter = "groupCode eq '9THS'";
var query = new TableQuery<AzStorageEntityAdapter<T>>().Where(combinedFilter);

TableRequestOptions tableRequestOptions = new TableRequestOptions() 
                                            { ServerTimeout = TimeSpan.FromSeconds(90) };

do
{
    var segments = await table.ExecuteQuerySegmentedAsync(query, continuationToken, tableRequestOptions, null);
    currentPageResult.AddRange(segments.Results.Select(s => s.InnerObject).ToList());
    continuationToken = segments.ContinuationToken;
}  while (continuationToken != null && !isPagination);;

它一直在工作,直到 azure table 的记录数量减少 (10000),比如 3 到 4 个不同的 Groupcodes

当 table 大小增加超过 200000 条记录时,搜索将不会 return 任何记录(即)segments.Results 有零条记录,但 continuationToken 有值.

如果我将 ExecuteQuerySegmentedAsync 替换为 ExecuteQuery,它 return 就是预期的记录。我尝试添加 ServerTimeoutMaximumExecutionTime 没有任何帮助。

这里有什么问题吗?

这里没有任何问题:)。这是预期的行为。

来自Query Timeout and Pagination

A query against the Table service may return a maximum of 1,000 items at one time and may execute for a maximum of five seconds. If the result set contains more than 1,000 items, if the query did not complete within five seconds, or if the query crosses the partition boundary, the response includes headers which provide the developer with continuation tokens to use in order to resume the query at the next item in the result set. Continuation token headers may be returned for a Query Tables operation or a Query Entities operation.

基本上您的查询正在执行完整的 table 扫描,因为您没有在查询中指定任何 PartitionKey 并且它会尝试从 [=24= 的顶部开始搜索匹配的记录] 至底部。由于它在 5 秒内未找到任何匹配的实体,因此它只是返回延续标记。

至于为什么 ExecuteQuery 起作用是因为它在内部处理延续令牌。您可以通过在 Fiddler 中跟踪 request/response 来确认。