【问题标题】:Indexing in Cosmos DBCosmos DB 中的索引
【发布时间】:2019-01-23 15:55:51
【问题描述】:

我有一个巨大的 Cosmos DB 集合。它有大约 500K 条记录,我的 RU 范围是 1000RU/s。我为我的自定义列创建了列索引。下面是索引 JSON 模式。

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
      {
        "path": "/Column1/?",
        "indexes": [
          {
            "kind": "Range",
            "dataType": "String",
            "precision": -1
          }
        ]
      },
      {
        "path": "/Column2/?",
        "indexes": [
          {
            "kind": "Range",
            "dataType": "String",
            "precision": -1
          }
        ]
      }
    ],
    "excludedPaths": [
      {
        "path":"/Column4/*"
      }
    ]
}

下面是我的收藏结构。

{
    "Column1": "Data1",
    "Column2": "Data2",
    "Column3": "Data3",
    "Column4": "Data4"
}

当我触发以下选择查询 ("SELECT * FROM r where INDEX_OF(r.Column2,'Data2')>-1") 时,它会返回正确的值。但它是批量执行它,而不是从索引中获取值。例如,查询应该只返回一条记录。但它返回空白并带有延续令牌。我希望索引应该从现有索引返回记录。有什么我错过的吗?

【问题讨论】:

  • 您使用 INDEX_OF 而不是字符串比较是否有原因?

标签: azure nosql azure-cosmosdb


【解决方案1】:

此查询不会使用索引,因为无法从索引中提供 INDEX_OF。 CONTAINS 系统函数也是如此(相当于 INDEX_OF() > -1)。对于字符串系统函数,只有那些函数会使用索引:

  • STARTSWITH(str_expr, str_expr)
  • LEFT(str_expr, num_expr) = str_expr
  • SUBSTRING (str_expr, num_expr, num_expr) = str_expr,但前提是第一个 num_expr 为 0

【讨论】:

  • 感谢您的快速回复。您提供的详细信息对使用 index.js 有很大帮助。除此之外,我们还需要有关检索记录总数的其他帮助。下面给出的是用于检索集合中可用记录总数的查询。 SELECT COUNT(1) FROM c where c.Column1 IN ('Data2')。在这里,此查询使用延续令牌从多个集合中检索数据。这会延迟总计数结果。请告诉我我们是否可以使用索引来增加查询性能而不增加 RU。
【解决方案2】:

了解 RU 限制,你有 1000 RU 的意思是,你不能在一秒钟内阅读超过 1000 个文档(1kb 文档大小)

您可能有两种解决方案:

  1. 您可以提高 RU 设置。 (临时增加RU)

  2. 您可以通过延续令牌继续寻找下一组结果并继续添加它,以便获得总数。(可能在 sdk 中)

【讨论】:

  • @DavidMakogon 你能解释一下吗
猜你喜欢
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多