gpt4 book ai didi

azure - 通过 join 过滤嵌套列表时是否使用 cosmos 索引?

转载 作者:行者123 更新时间:2023-12-03 06:14:57 25 4
gpt4 key购买 nike

假设我有一个 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)

有没有办法验证我的索引是否用于特定查询?

最佳答案

我对这类问题的偏好就是尝试一下。

使用 the code here 可以轻松地将数十万个文档批量加载到集合中.

我已针对您的系列模型(250,000 个文档)执行了此操作,并应用了您的索引策略。

正在运行

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

使用门户中的“新建 SQL 查询”选项卡会返回以下查询统计信息(显示已使用索引)

<表类=“s-表”><标题>公制值 <正文>请求费用 2.83 RU显示结果1-1检索到的文档数1检索到的文档大小298 字节输出文档计数1输出文档大小353 字节 索引命中文档计数 1索引查找时间0.1 毫秒文档加载时间0.02 毫秒查询引擎执行时间0.01 毫秒系统函数执行时间0 毫秒用户定义函数执行时间0 毫秒文档写入时间0 毫秒

关于azure - 通过 join 过滤嵌套列表时是否使用 cosmos 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76343124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com