我正在尝试执行一个非常大的查询,该查询需要返回数百万条记录,因此我想对查询进行分区并使用多台计算机来处理结果。
我的逻辑分区键将是文档的UUID,因此这对我将不同的部分分配给每个工作程序节点不是很有帮助。我可以获取物理分区ID并仅在特定物理分区内执行查询吗?
这是我尝试过的:
FeedOptions feedOptions = new FeedOptions();
feedOptions.setEnableCrossPartitionQuery(false);
feedOptions.setPartitionKeyRangeIdInternal("0");
client.queryDocuments(collectionPath, "SELECT * FROM e where e.docType
= 'address'", feedOptions).flatMapIterable(FeedResponse::getResults);
但是更改partitionKeyRangeId似乎根本不会改变结果。
请告知。
答案 0 :(得分:0)
据我所知,到目前为止,它不能在特定的物理分区内执行。我在Cosmos DB Rest Api中找不到与物理分区有关的任何参数。您在代码中提到的PartitionKeyRangeId用于change feed请求中。
基于official doc中的语句,我们无法管理cosmos db中的物理分区:
Azure Cosmos DB将自动缩放物理数量 根据您的工作负载进行分区。所以你不应该把你的 数据库设计基于物理分区的数量来代替 应该确保选择正确的分区键来确定 逻辑分区。
但是,由于cosmos db具有灵活性,可用性和启发性,因此如果您确实有与物理分区相关的要求,可以提交feedback来寻求进一步的帮助。
希望它对您有帮助。
更新答案:
有很多方法可以提高处理大量数据的性能,在这里我只提供一些个人建议。
1。您可以尝试考虑选择比UUID
更合适的分区键,以大大提高性能。
2。尝试使用page size
限制每个查询的项目数,然后通过多线程实现查询和处理并行性。
3。增加RUs设置以提高性能。
更多建议,请参阅此doc。