假设我有一个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)
是否有方法可以验证我的索引是否用于特定查询?
1条答案
按热度按时间a1o7rhls1#
我对这类问题的偏好只是尝试一下。
使用the code here可以很容易地将数十万个文档批量加载到集合中。
我已经为您的系列模型(250,000个文档)执行了此操作,并应用了您的索引策略。
跑步
使用门户中的“NewSQLQuery”选项卡将返回以下查询统计信息(显示使用的索引)
| 公制|价值|
| - -----|- -----|
| 请求收费|**2.83罗斯 *|
| 显示结果|一比一|
| 检索的文档计数|1|
| 检索的文档大小|298字节|
| 输出文档计数|1|
| 输出文档大小|353字节|
|索引命中文档数| 第一章|
| 索引查找时间|0.1毫秒|
| 文件载入时间|0.02毫秒|
| 查询引擎执行时间|0.01毫秒|
| 系统功能执行时间|0ms|
| 用户定义函数执行时间|0ms|
| 文档写入时间|0ms|