根据这篇文章,我有一个战略问题:
https://docs.microsoft.com/en-us/azure/cosmos-db/partition-data
A)我应该构建我的分区键,以便我的查询(理想情况下)最终在一个分区?例如 . PartitionKey = CustomerId
要么
B)文档是否仍处理有效跨越多个(多个)分区的查询?例如 . PartitionKey =“CustomerId ContextName TypeName”
我们目前已经实现了“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>
文章中列出的场景似乎假设客户或用户将生成大量密钥 . 这对我们来说不是真的 .
1 回答
运行跨分区查询时,Docdb Sdk会进行并行调用 . 如果检查网络流量,您会注意到,它首先查询物理分区键范围,然后单独调用每个分区键范围 . 它并行执行,它允许控制maxdegreeofparallelism等 .
话虽如此,有两个方面需要考虑:
如果你的音量是1 TB,那就意味着需要至少100个物理分区(每个分区为10 GB),因此它至少会进行100次呼叫 . 如果您的数据量增长,拨打更多电话可能会影响性能 .
如果您正在使用聚合,目前由doc db SUM / AVG / COUNT / MIN / MAX支持 . 这些不能跨分区执行 .