C# 从Azure表存储中检索100多万条记录

C# 从Azure表存储中检索100多万条记录,c#,.net,azure,azure-functions,azure-table-storage,C#,.net,Azure,Azure Functions,Azure Table Storage,我的表存储大约有100-200万条记录,我每天都有一项工作,需要检索所有没有属性a的记录并进行进一步处理 预计大约有1-150万条记录没有财产A。我知道有两种方法 查询所有记录,然后过滤结果 做一个表格扫描 目前,它使用的方法是查询所有记录并用c进行过滤。但是,该任务正在Azure Function应用程序中运行。检索所有结果的查询有时需要超过10分钟,这是Azure函数的限制 我试图理解为什么检索一百万条记录需要这么长时间,以及如何优化查询。表的现有设计是分区和行键是相同的,并且是一个guid

我的表存储大约有100-200万条记录,我每天都有一项工作,需要检索所有没有属性a的记录并进行进一步处理

预计大约有1-150万条记录没有财产A。我知道有两种方法

查询所有记录,然后过滤结果 做一个表格扫描 目前,它使用的方法是查询所有记录并用c进行过滤。但是,该任务正在Azure Function应用程序中运行。检索所有结果的查询有时需要超过10分钟,这是Azure函数的限制

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

查看Microsoft文档,以下是一些关键表存储限制:

每个存储帐户的最大请求速率:每秒20000个事务,假定实体大小为1-KiB 单个表分区1 KiB实体的目标吞吐量:每秒最多2000个实体。 我最初的猜测是,我应该使用另一个分区键将每个分区的2000个实体分组,以实现每个分区每秒2000个的目标吞吐量。这是否意味着理论上可以在1秒内返回2000000条记录


任何想法或建议都值得赞赏。

我看到两种方法可以在批处理过程中检索1+条记录,其中结果必须保存到单个媒体(如文件)

首先,标识/选择相关数据的所有主id/密钥。然后用这些主id/键的块生成并行作业,在这些块中读取实际数据并进行处理。然后,每个作业向单一媒体报告结果

其次,您标识/选择更新相关数据的前n名,并将此数据标记为正在处理的状态。在这里使用并发锁定,这将防止其他人在并行执行时获取该数据


如果可能的话,我会选择第一种解决方案,因为它是最简单、最干净的解决方案。第二种解决方案是最好的,如果您使用select for update,我不知道Azure Table Storage是否支持该解决方案。

您需要对该任务进行并行处理。因为您不知道分区键,所以运行24个单独的查询,分别从alaphabet的每个字母开始和结束。在PK>a&&PKB我在写了关于这个主题的博客后发现了这个问题。我有一个项目,我正在使用Azure功能消费计划,并且有一个庞大的Azure存储表350万条记录

以下是我的博客帖子:

我在这篇博文中提到了几个选项,但我认为最快的方法是将表格扫描工作分配到较小的工作项中,这些工作项可以在10分钟内轻松完成。如果你想试试的话,我在博客上有一个实现链接。可能需要一些时间来适应Azure功能,但找到分区键范围的大部分聪明部分都已经实现并测试过了


这看起来基本上就是user3603467所建议的。

为什么不将请求分块,继续获得前100名,直到结果<100?然后你也可以在并行进程上进行。你需要以多快的速度进行处理?使用每2分钟运行一次的时间触发器Azure函数,查询前N个没有属性a的实体并设置它们怎么样?检索所有结果后发生的过程是将其导出为CSV。据我所知,我们可以将记录批处理到多个CSV中,但不希望有太多。我认为2-3是可以接受的。我现在的想法是使用一个持久的函数,以及是否有可能在多个活动中实际扇出表存储查询,然后扇入处理。但是可能需要建立一些逻辑来防止查询重复的实体?有时间限制,所以我试图用尽可能少的工作量找到一个足够好的解决方案更新:所以不能选择更改分区键,因为可能会影响依赖它的部分。@Frank Nielsen您能否澄清一下,如何并行获得前100个结果,而不获得相同的100个结果对于每个问题?如果我错了请纠正我。。。对于第一种方法,我们需要首先检索分区键,这将是一个问题,因为如果您选择了存储中的所有键,那么您已经获得了整个实体。使用这种方法,并行作业并发写入文件是不安全的,因此,如果我们引入一些锁定,可能会出现瓶颈。我不熟悉ATS,但您读过这篇文章吗:。也许,如果可能的话,你的日常工作应该是 每5分钟工作一次?也可以通过事件/触发器驱动的作业将标识放在不同的表中。