我在应用程序上的某个地方有一些非常旧的代码,我不小心触发了:
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 数据工厂来执行此操作。