我想查询Azure Cosmos DB容器中所有分区中某个属性的不同值。
被查询的特定属性是索引的,并且具有低基数,即不同值的数量很少(小于100)。
虽然查询必须在所有分区上运行,但我认为这种查询将是有效的,因为它可以直接从索引中解析。
SQL查询是:(cnt
是我感兴趣的低基数属性)
SELECT DISTINCT c.cnt FROM c
查询统计(从Azure门户)报告:
- 请求收费:13386.61 RUs
- 显示结果:1 - 9
- 检索文档数:753161
- 检索文档大小:676125621字节
- 输出文件数:15
- 输出文件大小:455字节
- 索引命中文档计数:0
- 索引查找时间:0 ms
- 文件加载时间:8341.91 ms
- 查询引擎执行时间:637.4 ms
我得到了9个结果,这是预期的基数。但是统计数据似乎表明根本没有使用索引,这使得它成为一个昂贵的查询。
检索到的文档数是753 161。我的第一个想法是查询扫描所有项目,所以我使用cnt
属性对所有项目进行计数:
SELECT COUNT(c.cnt) AS TotalCount FROM c
但结果是:
[
{
"TotalCount": 3518847
}
]
这告诉我,在3 518 847个项目中,有753 161个(~21%)被扫描。这很好,但让我更不了解发生了什么。
现在回答我的问题:
可以写SELECT DISTINCT查询(跨分区),以便它(正确)使用索引吗?
如果没有,请帮助我理解为什么统计数据表明扫描超过21%的具有查询属性的项目。
是否可以编写SELECT DISTINCT查询(跨分区)以使其(正确)使用索引?
不,你不能,但这是他们正在开发的一个功能(源代码)。
为什么它只扫描21%,我不太清楚,因为我希望它遍历整个集合。可能Azure Portal只检索了结果的一部分,而碰巧21%的数据包含了你期望的每个不同的值。
在这种情况下,REST API将返回一个延续令牌来检索下一组文档(通常在Azure Portal中通过Results选项卡上的load more
按钮可见)。