代码之家  ›  专栏  ›  技术社区  ›  Pரதீப்

当Azure表有更多记录时,ExecuteEquerySegmentedAsync不工作

  •  0
  • Pரதீப்  · 技术社区  · 6 年前

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

    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表的记录数(10000)少于say 3到4个不同的 Groupcodes .

    当表大小增加超过200000条记录时,搜索将不会返回任何记录(即) segments.Results 没有记录,但是 continuationToken 有值。

    如果我替换 ExecuteQuerySegmentedAsync 具有 ExecuteQuery 它返回预期的记录。我试图补充 ServerTimeout , MaximumExecutionTime 没什么帮助。

    这里怎么了?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Gaurav Mantri    6 年前

    这里没什么问题。)这是预期行为。

    Query Timeout and Pagination :

    对表服务的查询最多可返回1000个项 一次执行,最多可执行5秒 . 如果 如果查询没有 在五秒钟内完成,或者如果查询跨越了分区 边界,响应包括提供开发人员的头 使用继续标记,以便在 结果集中的下一项。延续标记头可以是 为查询表操作或查询实体操作返回。

    基本上,您的查询正在执行完整的表扫描,因为您没有指定任何 PartitionKey 在查询中,它尝试从表的顶部到底部搜索匹配的记录。由于它在5秒内找不到任何匹配的实体,所以它只是返回延续标记。

    至于为什么 ExecuteQuery 工作是因为它在内部处理延续标记。您可以通过在fiddler中跟踪请求/响应来确认它。