DocumentDb跨分区查询策略

TBo*_*one 2 azure-cosmosdb

根据本文,我有一个策略问题:

https://docs.microsoft.com/zh-cn/azure/cosmos-db/partition-data

A)我是否应该对分区键进行结构设计,以使查询(理想情况下)最终集中在一个分区上?例如,PartitionKey = CustomerId

要么

B)文档是否仍然有效地处理跨越多个(许多)分区的查询?例如。PartitionKey =“客户编号+上下文名称+类型名称”

我们目前已经实现了“ A”,但是由于本文中引用了以下内容,因此我们已经讨论了“ B”:

最好的做法是使分区键具有许多不同的值(最小为100s-1000s)。

强调“至少”。我们的CustomerIds不能产生超过2-300个分区键。如果我们向其中添加更多信息(“ B”),则知道一个查询可能会命中30-50个分区(即专门添加“ TypeId”)

SELECT * FROM c 
WHERE(MyPartition = "1+ContextA+TypeA"
   OR MyPartition = "1+ContextA+TypeB"
   OR MyPartition = "1+ContextA+TypeC"
   ...)
   AND <some other conditions>
Run Code Online (Sandbox Code Playgroud)

本文中介绍的方案似乎假定客户或用户将生成大量密钥。这对我们来说不是真的。

小智 5

当您运行跨分区查询时,Docdb Sdk会进行并行调用。如果检查网络流量,您会注意到,它首先查询物理分区键范围,然后分别调用每个分区键范围。它并行执行,并允许控制最大并行度等。

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

  • 数据量

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

  • 查询聚合

如果您使用的是聚合,则doc db SUM / AVG / COUNT / MIN / MAX当前支持。这些不能跨分区执行。