我有一个跨分区查询,该查询依次返回每个分区的行,这很有意义,分区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个线程来对返回的每一行进行操作,因此我先依次研究jam
和pickles
然后cookies
和sweets
因此在我对jam
和pickles
我希望将结果返回为:
jam <--- stored in partition 5
cookies <--- stored in partition 8
sweets <--- stored in partition 9
pickles <--- stored in partition 5
对于普通的API调用,我们总是知道container
,这是批量删除和很少删除的要求。
如果知道分区号并且可以向查询提供分区号,那么我很乐意发出10个查询并将其视为10个单独的作业。
答案 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 的地方,我怀疑第一部分是某些页面跟踪,第二部分是分区