从Azure Table Storage检索1+百万条记录

问题描述 投票:1回答:2

我的表存储大约有1-2百万条记录,我的日常工作需要检索没有属性A的所有记录并进行一些进一步处理。

[据估计,大约有1-150万条没有财产A的记录。我知道有两种方法。

  1. 查询所有记录,然后过滤结果
  2. 进行表扫描

当前,它使用的方法是查询所有记录并使用c#进行过滤。但是,该任务正在Azure功能应用程序中运行。检索所有结果的查询有时需要10分钟以上,这是Azure Functions的限制。

我试图理解为什么检索一百万条记录花费的时间如此长,以及如何优化查询。该表的现有设计是,分区和行键是相同的,并且是一个向导-这使我相信每个分区都有一个实体。

查看Microsoft文档,这是一些关键的表存储限制(https://docs.microsoft.com/en-us/azure/storage/common/storage-scalability-targets#azure-table-storage-scale-targets):

  • [每个存储帐户的最大请求速率:每秒20,000个事务,假定实体大小为1-KiB
  • 单个表分区(1 KiB实体)的目标吞吐量:每秒最多2,000个实体。

我最初的猜测是,我应该使用另一个分区密钥将每个分区2,000个实体分组,以实现每个分区每秒2,000个目标吞吐量。从理论上讲,这是否意味着1秒钟内可以返回2,000,000条记录?

任何想法或建议都会受到赞赏。

c# .net azure azure-functions azure-table-storage
2个回答
0
投票

我发现有两种方法可以在批处理中检索1个以上的记录,其中必须将结果保存到单个介质(例如文件)中。

第一]您标识/选择相关数据的所有主要ID /密钥。然后,使用这些主要ID /键的块生成并行作业,在其中读取实际数据并进行处理。然后将每个作业的结果报告给单一媒体。

第二个]您标识/选择(更新)相关数据的前n个,并将该数据标记为正在处理的状态。在此使用并发锁定,如果并行完成,应该可以防止其他人拾取该数据。

如果可能,我将寻求第一个解决方案,因为它是最简单,最干净的解决方案。如果您使用“选择更新”,则第二种解决方案是最好的,我不知道Azure表存储是否支持该选择。


0
投票

您需要对任务进行校验。如您所不知道的分区键,请运行24个独立的查询PK,分别针对字母表字母的每个字母开始和结束。编写一个查询,其中PK> A && PK B

© www.soinside.com 2019 - 2024. All rights reserved.