当你在一个巨大的表存储表上执行 ToList() 时会发生什么?



我在应用程序上的某个地方有一些非常旧的代码,我不小心触发了:

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

另一名嫌疑人是:

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

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

大约在我点击此代码的同时,它取出了我的应用程序的一个实例,并且该实例没有返回超过一个小时。即使在重新启动后。

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

大约在我点击此代码的同时,它取出了我的应用程序的一个实例,并且该实例没有返回超过一个小时。即使在重新启动后。

根据我的知识,我们可以使用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 数据工厂来执行此操作。

相关内容

  • 没有找到相关文章

最新更新