使用CosmosDB进行跨分区查询以进行批量操作的最有效方法

时间:2018-07-20 11:34:16

标签: azure-cosmosdb

我有一个跨分区查询,该查询依次返回每个分区的行,这很有意义,分区1的所有结果,分区2的所有结果,等等。

对于返回的每一行,我需要执行一个操作,可以是删除或更新。

记录太多,无法全部读取它们然后执行操作,因此我需要流式传输结果并同时执行操作。

我遇到的问题是,我的动作很快又用完了RU,因为我的操作依次在每个分区上运行,并且单个分区分配了RU的十分之一。

我可以在PartitionKey中指定一个FeedOptions,但这对我没有帮助,因为我不知道密钥是什么。

我的查询看起来像

select r.* from r where r.deleted 

partition在名为container的字段

想象一下我有以下物品

container|title    |deleted
jamjar   |jam      |true      <--- stored in partition 5
jar      |pickles  |true      <--- stored in partition 5
tin      |cookies  |true      <--- stored in partition 8
tub      |sweets   |true      <--- stored in partition 9

我愿意select r.title from r where r.deleted 我的查询将按以下顺序返回行

jam      <--- stored in partition 5
pickles  <--- stored in partition 5
cookies  <--- stored in partition 8
sweets   <--- stored in partition 9

我使用ActionBlock允许我旋转2个线程来对返回的每一行进行操作,因此我先依次研究jampickles然后cookiessweets因此在我对jampickles

执行操作时消耗了第5部分的RU

我希望将结果返回为:

jam      <--- stored in partition 5
cookies  <--- stored in partition 8
sweets   <--- stored in partition 9
pickles  <--- stored in partition 5

对于普通的API调用,我们总是知道container,这是批量删除和很少删除的要求。

如果知道分区号并且可以向查询提供分区号,那么我很乐意发出10个查询并将其视为10个单独的作业。

1 个答案:

答案 0 :(得分:0)

您需要设置MaxDegreeOfParallelism中的FeedOptions

FeedOptions queryOptions = new FeedOptions
{
   EnableCrossPartitionQuery = true,
   MaxDegreeOfParallelism = 10,
};

它将为每个分区创建一个客户端线程,如果您检查HTTP标头,则可以看到发生了什么事

x-ms-documentdb-query-enablecrosspartition: True
x-ms-documentdb-query-parallelizecrosspartitionquery: True
x-ms-documentdb-populatequerymetrics: False
x-ms-documentdb-partitionkeyrangeid: QQlvANNcKgA=,3

注意 QQlvANNcKgA =,3 ,您会看到其中10个具有,0 ,9 的地方,我怀疑第一部分是某些页面跟踪,第二部分是分区

请参阅文档Parallel query execution