为什么我在 2 个看似相同的 CosmosDb Collections 之间看到不同的索引行为

Why am I seeing different index behaviour between 2 seemingly identical CosmosDb Collections

我正在尝试调试表面上配置相同的 2 个单独的 cosmos db collection 之间的一个非常奇怪的差异。

我们最近修改了一些执行以下查询的代码。

旧查询

SELECT * FROM c 
WHERE c.ProductId = "CODE" 
AND c.PartitionKey = "Manufacturer-GUID"

新查询

SELECT * FROM c
WHERE (c.ProductId = "CODE" OR ARRAY_CONTAINS(c.ProductIdentifiers, "CODE")) 
AND c.PartitionKey = "Manufacturer-GUID"

在生产环境中引入 Array_Contains 调用使该查询的性能从 ~3 RU/s ==> ~6000 RU/s 下降。但仅限于生产环境。

原因似乎是在生产中,它没有达到索引。请参阅以下两种环境的输出。

开发配置

Collection 规模:2000 RU/s

索引策略:(注意 ETag 的排除路径)

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Spatial",
                    "dataType": "Point"
                }
            ]
        }
    ],
    "excludedPaths": [
        {
            "path": "/\"_etag\"/?"
        }
    ]
}

产品配置

Collection 规模:10,000 RU/s

索引策略:(注意与 DEV 相比,ETag 缺少排除路径)

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Spatial",
                    "dataType": "Point"
                }
            ]
        }
    ],
    "excludedPaths": []
}

比较两种环境的输出结果时,DEV 显示索引命中,而 PROD 显示索引未命中,尽管索引策略之间没有明显差异。

DEV

结果
Request Charge:           3.490 RUs
Showing Results:          1 - 1
Retrieved document count: 1
Retrieved document size:  3118 bytes
Output document count:    1
Output document size:     3167 bytes
Index hit document count: 1

PROD

结果
Request Charge:           6544.870 RUs
Showing Results:          1 - 1
Retrieved document count: 124199
Retrieved document size:  226072871 bytes
Output document count:    1
Output document size:     3167 bytes
Index hit document count: 0

我唯一能在网上找到的是文档中对 Cosmos Collection 中发生的一些更改的引用,指出 "New Index Layout" 正在用于较新的 collections,但没有其他提及索引布局作为我可以在文档中的任何地方找到的概念。

https://docs.microsoft.com/en-us/azure/cosmos-db/index-types#index-kind

关于 debugging/addressing 这个问题,任何人都知道我可以从哪里开始。

您的开发容器较新并使用我们的 v2 索引,该索引在 Array_Contains() 方面有显着改进。要了解有关如何升级 PROD 容器的更多信息,请发送电子邮件至 askcosmosdb at microsoft dot com。

谢谢。