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