【发布时间】:2025-12-19 03:00:06
【问题描述】:
我有一个跨分区查询,它依次返回每个分区的行,这是有道理的,所有分区 1 的结果,所有分区 2 的结果等等。
对于返回的每一行,我需要执行一个操作,可以是删除或更新。
记录太多,无法全部读取并执行操作,因此我需要将结果流式传输并同时执行操作。
我遇到的问题是我很快就用完了 RU,因为我的操作依次在每个分区上运行,并且单个分区分配了十分之一的 RU。
我可以在FeedOptions 中指定PartitionKey,但这对我没有帮助,因为我不知道密钥是什么。
我的查询看起来像
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 从而消耗分区中的 RU 5 当我对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 个单独的作业。
【问题讨论】:
-
您可以运行查询
SELECT DISTINCT c.container FROM c where c.deleted = true选择所有已删除项目的分区,然后运行存储过程为每个分区批量删除文档 -
我的示例可能具有误导性,我可以读取所有数据,问题是,它按顺序使用每个分区上的所有 RU,而不是在初始选择中为每个分区返回几行。跨度>
-
我猜,是按照cosmos里面的分区设计的。因此,具有相同分区键范围的分区的每个文档都位于相同的物理位置。这就是为什么当使用查询跨分区时,您将首先从一个物理位置看到结果,然后是其他位置。为了解决您的问题,您可以编写自己的管理器,将负载分配到客户端的分区上。
-
cosmos 只是自己处理分区,这对于正常使用来说很好,它只是我的一次批量操作受阻。我刚刚重新阅读了其中一个文档,我想我需要这样做docs.microsoft.com/en-us/azure/cosmos-db/…(我确定我之前尝试过:))
-
我设置了
EnableCrossPartitionQuery选项并使用 fiddler 来查看会发生什么,我可以看到它发出 10 个请求并设置一个看起来与分区有关的标头——我已经回答了下面
标签: azure-cosmosdb