【问题标题】:CosmosDb search on the Index vs partition KeyCosmosDb 搜索索引与分区键
【发布时间】:2021-11-26 09:12:46
【问题描述】:

默认情况下,在 cosmosDb 中,文档中的所有属性都已编入索引,那么我为什么要对分区键进行研究,而对索引的搜索也能完美运行且无需任何成本?

我有一个 cosmosDb,其中包含一百万个这样的文档,每个文档都包含一个数组,分区键是“tankId”,例如:

{
    "id": "67acdb16-80dd-4a6c-a5b0-118d5f5fdb97",
    "tankId": "67acdb16-80dd-4a6c-a5b0-118d5f5fdb97"
    "UserIds": [
        "905336a5-bf96-444f-bb11-3eedb65c3760",
        "432270f5-780f-401b-9772-72ec96166be1",
        "cfecdf7e-5067-46b1-ab4e-25ca7d597248"
    ],
}

如果我对这百万个不是分区键而是索引属性的文档的“UserIds”进行请求,则只需要 3.32 RU !!!哇。

SELECT *
FROM c 
WHERE ARRAY_CONTAINS(c.UserIds, "905336a5-bf96-444f-bb11-3eedb65c3760")

做这种请求是个好习惯吗?我有点担心我的设计。

【问题讨论】:

    标签: azure azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

    一旦您的物理分区数量开始增长,它就开始变得重要了。使用分区键将允许 Cosmos 将查询映射到位于物理分区中的逻辑分区。因此查询不会是所谓的“跨分区查询”,也不必检查其他物理分区的索引(这也会消耗 RU)。

    在您的情况下,您正在谈论一百万个文档,这些文档可能使用远少于 50GB 的数据(物理分区的最大大小),因此它们都存储在同一个物理分区中。因此,您不会对 RU 使用产生任何明显影响。

    所以要回答您是否应该进行任何更改的潜在问题。您的数据库主要是读取量大吗?您是否有任何经常用于查询的属性?您确定您的分区保持在逻辑分区大小限制 (20GB) 之下吗?如果是,那么您可能应该在设计中考虑它。即便如此,只有在您的数据开始在物理分区中拆分时才有意义。

    【讨论】:

      猜你喜欢
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多