分区集合 paritionkey

Partitioned Collection paritionkey

我不知道为 PartitionKey 选择什么以及它有什么作用。如果我使用分区集合,那么我必须定义一个分区键,DocumentDB 可以使用它在多个服务器之间分发数据。但是假设我选择了一个对所有文档始终相同的 partitionKey。我还能为单个分区集合获得高达 250k RU/s 吗?

在我的例子中,主要查询是获取所有带分页的文档,但在时间轴中(最新的优先)

SELECT TOP 10 c.id, c.someValue, u.id FROM c
JOIN u IN c.users ORDER BY c.createdDate DESC

文档的缩小版本如下所示

    {
     id: "1", 
     someValue: "Foo"
     createdDate: "2016-14-4-14:38:00.00"
     //Max 100 users
     users: [{id: "1", id: "2"}]
    }

不,您需要有多个不同的分区键值才能在 DocumentDB 中实现高吞吐量水平。

DocumentDB 中的一个分区最多支持 10,000 个 RU/s,因此您至少需要 25* 个不同的分区键值才能达到 250 个 RU/s。 DocumentDB 将分区键均匀地分布在可用分区中,即一个分区可能包含具有多个分区键的文档,但分区键的数据保证保留在单个分区中。您还必须以在这些分区键上分布 reads/writes 的方式构建您的工作负载。

*实际上您可能需要比 25 (50-100) 稍微多一些的分区键,因为一些分区键可能散列到同一个分区

因此,我们有一个吞吐量为 10000 RU/s 的分区(10 个分区)集合。分区键是国家代码,我们只有 5 个国家的数据。 两个国家的数据被散列到同一个物理分区。根据在以下 link 中找到的文档,我们希望一旦达到上述分区的 10GB 限制,数据就会重新组织到空分区中。那没有发生,我们无法再为这两个国家添加数据。

显然,正确的做法是选择一个确保低基数的分区键,但文档具有误导性。

https://docs.microsoft.com/en-us/azure/cosmos-db/partition-data

当物理分区 p 达到其存储限制时,Cosmos DB 将 p 无缝拆分为两个新分区 p1 和 p2,并将大约一半的键对应的值分配给每个分区。此拆分操作对您的应用程序不可见。