CosmosDB Distinct查询性能缓慢,如何限制复合索引仅作用于指定分区
问题解答
疑问1:如何限制复合索引仅作用于特定分区键WHATEVERPTKEY
Cosmos DB的索引策略是集合全局生效的,不存在只对特定分区键值生效的配置规则。
你无需担心该复合索引对其他分区的影响:
- 仅当写入/更新的文档同时包含
ptkey、SomeCategory、SomeType、SomeName四个字段时,才会产生极少量的额外索引写入RU开销,若其他分区的文档不涉及这几个字段,完全不会受该复合索引影响 - 你当前默认已经配置了
/*全路径索引,上述四个字段原本就已经被范围索引覆盖,新增复合索引的额外写入成本可以忽略不计
你计划新增的复合索引是当前场景下投入产出比最高的优化方案,它可以让你的Distinct查询完全走索引覆盖,不需要加载任何业务文档,耗时可以直接降到10ms以内。
疑问2:除数据重构外的更优替代方案
从你给出的无自定义索引查询统计可以看到,366ms的文档加载时间是性能瓶颈的核心:无匹配复合索引时,Cosmos DB需要扫描分区内所有符合过滤条件的完整文档做去重计算,文档体积过大直接拉长了整体耗时。除新增复合索引外,还可以选择以下优化方案:
- 排除无关大字段索引:将当前查询不需要的大体积字段路径加入索引策略的
excludedPaths列表,同时只保留查询相关字段的索引规则,可降低索引扫描和文档加载的开销 - 预计算查询结果:如果该查询对数据实时性要求不高,可以通过Cosmos DB变更馈送监听
WHATEVERPTKEY分区的数据变更,预计算并维护SomeType+SomeName的唯一值列表到独立的小元数据集合,查询时直接访问元数据集合即可,耗时可降到毫秒级 - 调整查询语法:将
Distinct替换为等价的GROUP BY c.SomeType, c.SomeName写法,在已有默认范围索引的场景下也能一定程度降低去重的计算耗时
内容的提问来源于stack exchange,提问作者TerrorBight
相关产品推荐
相关产品推荐

