Azure cosmosdb DocumentDb跨分区查询策略

Azure cosmosdb DocumentDb跨分区查询策略,azure-cosmosdb,Azure Cosmosdb,基于本文,我有一个战略问题: A) 我是否应该构造分区键,以便查询(理想情况下)在一个分区结束?例如,PartitionKey=CustomerId 或 B) 文档是否仍然有效地处理跨多个(多个)分区的查询?例如,PartitionKey=“CustomerId+ContextName+TypeName” 我们目前实施了“A”,但讨论了“B”,因为文章中有以下引用: 最好的做法是使用一个具有许多不同属性的分区键 数值(至少100s-1000s) 强调“至少”。我们的CustomerID的卷不能

基于本文,我有一个战略问题:

A) 我是否应该构造分区键,以便查询(理想情况下)在一个分区结束?例如,PartitionKey=CustomerId

B) 文档是否仍然有效地处理跨多个(多个)分区的查询?例如,PartitionKey=“CustomerId+ContextName+TypeName”

我们目前实施了“A”,但讨论了“B”,因为文章中有以下引用:

最好的做法是使用一个具有许多不同属性的分区键 数值(至少100s-1000s)

强调“至少”。我们的CustomerID的卷不能产生超过2-300个分区键。我们是否应该向它添加更多信息(“B”),因为我们知道一个查询可能会访问30-50个分区(即专门添加的“TypeId”)

从c中选择*
其中(MyPartition=“1+ContextA+TypeA”
或MyPartition=“1+ContextA+TypeB”
或MyPartition=“1+ContextA+TypeC”
...)
及

本文中列出的场景似乎假定客户或用户将生成大量密钥。这对我们来说不是真的。

Docdb Sdk在运行跨分区查询时会进行并行调用。 如果您检查网络流量,您会注意到,它首先查询物理分区密钥范围,然后对每个分区密钥范围进行单独调用。 它并行执行,并允许控制maxdegreeofparallelism等

话虽如此,有两个方面需要考虑:

  • 数据量
如果您的卷是1TB,这意味着它将需要至少100个物理分区(每个分区为10GB),因此它将进行至少100次调用。 如果数据量增加,则进行更多调用可能会开始影响性能

  • 查询聚合

如果您正在使用当前由doc db SUM/AVG/COUNT/MIN/MAX支持的聚合。这些聚合无法跨分区执行。

请参阅以获取有关Azure documentDB的更多信息。从文档中,我们可以知道哪些数据存储在同一个分区中,以及如何选择正确的分区键property@TomSun-谢谢你的链接。我已经看过那份文件了。我可以用多种方式区分我的数据。它似乎没有回答这样一个基本问题:我的分区的设计应该使我的查询以单个分区为目标,还是跨多个分区的查询仍然表现良好?
SELECT * FROM c 
WHERE(MyPartition = "1+ContextA+TypeA"
   OR MyPartition = "1+ContextA+TypeB"
   OR MyPartition = "1+ContextA+TypeC"
   ...)
   AND <some other conditions>