适用对象: NoSQL MongoDB Cassandra Gremlin 表
分层分区键或子分区使你能够为分区键配置最多三级层次结构,以进一步优化数据分布并实现更高的规模。 本文解答有关 Azure Cosmos DB 分层分区键的常见问题。
是否可以将分层分区键添加到现有容器?
不支持将分层分区键添加到现有容器。 但是,你可以使用所需的分层分区键创建新容器,并运行容器复制作业,以将现有容器中的数据复制到新容器。 有关如何复制数据的详细信息,请参阅容器复制作业。
逻辑分区键的大小是否有存储限制?
是的。 就像现在的 Azure Cosmos DB 一样,逻辑分区大小仍限制为 20 GB。 但是,对于分层分区键,逻辑分区现在是整个分区键路径。 例如,如果按 TenantId -> UserId 分区,则示例逻辑分区将为 Contoso_Alice
。 利用子分区意味着可以具有 20 GB 的数据,其中分区键值为 Contoso_Alice
。 “Contoso”允许的数据存储量实际上是租户“Contoso”的 20 GB * 唯一 UserId 数。
对物理分区的存储和 RU/秒限制是否有任何更改?
否。 就像现在的 Azure Cosmos DB 一样,物理分区可以容纳 50 GB 的存储,并提供高达 10,000 RU/秒的服务。 但是,对于分层分区键,如果特定分区键前缀(例如 TenantId)的数据位于多个物理分区中,则子分区意味着单个 TenantId 可实现的总 RU/秒可能超过 10,000 RU/s。
如果执行查询并仅在路径的“中间”指定分区键,会发生什么情况?
你的查询是跨分区查询。 例如,如果按 TenantId -> UserId 进行分区,并且在查询中仅提供 UserId,则此查询将展开到所有物理分区。
若要使用 TenantId -> UserId 示例高效路由查询,有两个选项:
- 提供 TenantId。 查询将转到包含 TenantId 数据的所有物理分区。
- 同时提供 TenantId 和 UserId。 查询将转到包含 TenantId 和特定 UserId 的单个物理分区。
是否必须在文档中创建新属性才能使用此功能?
否。 指定要在容器创建期间使用的分区键路径的层次结构。 例如,如果按 TenantId -> UserId 进行分区,则无需创建连接这些值的新属性。 确保每个文档都有属性 TenantId 和属性 UserId。 有关详细信息,请参阅子分区代码示例。
我创建了一个没有太多基数的键层次结构。 应采取何种操作?
你可能遇到工作负载仅命中所有分区中的几个物理分区的方案。 此方案可能意味着一个或多个级别的分层分区键基数较低。 要对方案进行故障排除,我们始终建议重新创建分层分区键,并且可以使用 DTS 更改密钥并将容器的数据复制到新容器。 如果无法执行此步骤,建议采用两种解决方法,以确保数据的统一分布
- 方法 1:
- 可以创建少于 10,000 RU 的容器,以确保只有一个物理分区。
- 引入大约 5 GB 的数据,以确保没有分区拆分。
- 纵向扩展到所需的 RU,继续引入数据,Azure Cosmos DB 可确保统一拆分物理分区。
- 方法 2:
- 可将套餐总数提高到更高的 RU 数,并引入所有数据。
- 然后,执行分区合并,以确保工作负载的分区不会碎片化,并且分布均匀
- 合并完成后,请纵向缩减回所需的原始 RU 数。
要更好地控制每个分区的吞吐量,还可以使用吞吐量重新分发来确保工作负载使用的分区具有足够的 RU,以用于将来的请求。
后续步骤
- 详细了解分层分区键。