昂贵 SELECT DISTINCT 低基数 属性

Expensive SELECT DISTINCT low cardinality property

我想查询 Azure Cosmos DB 容器中所有分区中某个 属性 的不同值。

被查询的特定 属性 被索引并且具有低基数,即不同值的数量很少(小于 100)。

尽管查询必须 运行 所有分区我认为这种查询会很有效,因为它可以直接从索引中解析。

SQL查询是:(cnt是我感兴趣的低基数属性)

SELECT DISTINCT c.cnt FROM c

查询统计(来自 Azure 门户)报告:

我得到 9 个结果,这是预期的基数。但统计数据似乎表明根本没有使用索引 - 使其成为一个昂贵的查询。

检索到的文档数是 753 161。我的第一个想法是查询扫描所有项目,所以我用 cnt 属性:[=17= 对所有项目进行了计数]

SELECT COUNT(c.cnt) AS TotalCount FROM c

但结果是:

[
    {
        "TotalCount": 3518847
    }
]

这告诉我扫描了 3 518 847 件物品中的 753 161 件 (~21%)。这很好,但让我对发生的事情了解得更少。

现在回答我的问题:

是否可以编写 SELECT DISTINCT 查询(跨分区)以便(正确)使用索引?

如果不是,请帮助我理解为什么统计数据表明扫描超过 21% 的所有项目都带有查询 属性。

Can the SELECT DISTINCT query (cross partition) be written so that it makes (proper) use of indexes?

不可以,但这是他们正在开发的功能 (source)

为什么它只扫描 21% 我不太清楚,因为我希望它遍历整个集合。可能是 Azure 门户只检索了一部分结果,而恰好你的 21% 的数据包含你期望的每个不同值。

在这种情况下,REST API 将 return 一个继续令牌来检索下一组文档(通常通过结果上的 load more 按钮在 Azure 门户中可见选项卡)。