在巨型表存储表上执行ToList()时会发生什么?

时间:2018-06-11 19:56:22

标签: azure azure-storage azure-table-storage

我的应用程序中有一些非常旧的代码,我意外触发了:

var json = table.CreateQuery<ActionLog>().ToList().ToJson();

另一名嫌犯是:

var action_log_list = await table.CreateQuery<ActionLog>()
    .Where(log => log.StartTime > startTime)
    .AsTableQuery()
    .[...]

问题是这张桌子很大 - 可能是数亿。

大约在我点击这段代码的同时,它取出了我的应用程序的一个实例,并且一个实例没有回来超过一个小时。即使在重新开始之后。

现在我正在调查一些轻微性能问题,所以我很想知道;这是巧合,还是上面的代码可以关闭一个表存储 - 就像一个'真正长时间运行的查询',然后阻塞即插入或读取该表?

1 个答案:

答案 0 :(得分:0)

  

大约在我点击这段代码的同时,它取出了我的应用程序的一个实例,并且一个实例没有回来超过一个小时。即使在重新开始之后。

根据我的知识,我们可以使用ExecuteSegmentedAsync来改善表现。以下是演示代码。

 var query = table.CreateQuery<ActionLog>().AsTableQuery();
 TableContinuationToken continuationToken = null;
 do
   {
      // Execute the query async until there is no more result
      var queryResult = await query.ExecuteSegmentedAsync(continuationToken);
      // to do something
      continuationToken = queryResult.ContinuationToken;
   } while (continuationToken != null);

由于它是巨大的表,它可能仍然需要很长时间才能做到这一点。我不会在我身边测试它。

但根据我的经验,如果我们想要处理如此庞大的记录,我建议你可以使用Azure Data factory来做到这一点。