azure 当通过连接对嵌套列表进行过滤时,是否使用cosmos索引?

6tr1vspr  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(129)

假设我有一个NoSQL Cosmos DB容器,其中包含以下形状的项目:

[
    {
        "id": "SmithFamily",
        "memberCount": 3,
        "children": [{
            "name": "Foo",
            "pets": [{ "name": "Bar" }]
        }]
    },
    {
        "id": "DoeFamily",
        "memberCount": 2,
        "children": [{
            "name": "Baz",
            "pets": [{ "name": "Qux" }]
        }]
    }
]

以及索引策略,如:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/children/[]/pets/[]/name/?"
        },
        {
            "path": "/children/[]/name/?"
        }
    ],
    "excludedPaths": [
        {
            "path": "/*"
        }
    ]
}

我发现我可以通过查询找到宠物名为“Qux”的家庭:

SELECT f
FROM family f
JOIN child IN f.children
WHERE ARRAY_CONTAINS(child.pets, {name: "Qux"})

但是这个查询会使用我打算让它使用的索引吗?/children/[]/pets/[]/name/?还是不?index-policy docs中的示例或描述都没有提到连接。但从我的理解,从索引政策与嵌套列表似乎是允许的,我没有得到任何投诉,当我应用的政策。
我认为这一点很重要,特别是如果我想创建一个复合指数,例如:

"compositeIndexes": [  
    [  
        {  
            "path": "/children/[]/pets/[]/name/?",
            "order":"ascending"
        },
        {  
            "path":"/memberCount",
            "order":"ascending"
        }
    ]
]

为了能够使用该索引,我相信我需要确保首先按宠物名称过滤,然后按成员计数排序,因此如果我运行:

SELECT f
FROM family f
JOIN child IN f.children
WHERE ARRAY_CONTAINS(child.pets, {name: "Qux"})
ORDER BY f.memberCount

而且它不使用复合索引中的第一个路径,据我所知,索引根本不会被使用,我会失去性能(并且它会使用更多的RU)。
这一切在索引/children/[]/name/?上看起来更直接,除非我误解了什么,否则应该在查询时使用:

SELECT * FROM c WHERE ARRAY_CONTAINS(c.children, {name: "Baz"}, true)

是否有方法可以验证我的索引是否用于特定查询?

a1o7rhls

a1o7rhls1#

我对这类问题的偏好只是尝试一下。
使用the code here可以很容易地将数十万个文档批量加载到集合中。
我已经为您的系列模型(250,000个文档)执行了此操作,并应用了您的索引策略。
跑步

SELECT f
FROM family f
JOIN child IN f.children
WHERE ARRAY_CONTAINS(child.pets, {name: "Qux"})

使用门户中的“NewSQLQuery”选项卡将返回以下查询统计信息(显示使用的索引)
| 公制|价值|
| - -----|- -----|
| 请求收费|**2.83罗斯 *|
| 显示结果|一比一|
| 检索的文档计数|1|
| 检索的文档大小|298字节|
| 输出文档计数|1|
| 输出文档大小|353字节|
|索引命中文档数| 第一章|
| 索引查找时间|0.1毫秒|
| 文件载入时间|0.02毫秒|
| 查询引擎执行时间|0.01毫秒|
| 系统功能执行时间|0ms|
| 用户定义函数执行时间|0ms|
| 文档写入时间|0ms|

相关问题