昂贵的SELECT DISTINCT低基数属性



我想查询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按钮可见)。

最新更新