You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的CosmosDB聚合查询未命中索引?请求费用过高

解决方案:CosmosDB聚合查询索引命中优化

核心问题分析

你的查询未命中索引的根本原因是复合索引的前缀与查询的过滤、分组逻辑不匹配:

  • 原复合索引以BusinessUnitId(分区键)开头,但初始查询未指定分区键过滤,且过滤条件Year=2023不在索引前缀位置,导致索引无法被匹配。
  • 即使添加分区键过滤后,由于Year仍不在索引前缀,索引只能部分命中,命中率极低。

具体优化步骤

1. 调整复合索引结构

修改复合索引,将过滤字段Year放在最前缀,接着是分区键BusinessUnitId,最后按顺序排列所有GROUP BY字段。这样查询的过滤条件和分组逻辑能完全匹配索引前缀,实现全索引命中:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/\"_etag\"/?"
        }
    ],
    "compositeIndexes": [
        [
            {
                "path": "/Year",
                "order": "ascending"
            },
            {
                "path": "/BusinessUnitId",
                "order": "ascending"
            },
            {
                "path": "/OrganizationId",
                "order": "ascending"
            },
            {
                "path": "/Month",
                "order": "ascending"
            },
            {
                "path": "/EmissionSourceCategoryId",
                "order": "ascending"
            },
            {
                "path": "/EmissionSourceCategory",
                "order": "ascending"
            },
            {
                "path": "/EmissionSourceSubCategory",
                "order": "ascending"
            }
        ]
    ]
}

2. 强制在查询中指定分区键

CosmosDB的索引是分区级别的,必须指定分区键才能让索引在目标分区内高效生效。修改查询语句,添加BusinessUnitId过滤条件(如果需要查询多个分区,可通过参数化遍历分区键值实现):

SELECT  c.BusinessUnitId, 
        c.OrganizationId, 
        c.Year,
        c.Month,
        SUM(c.CO2eValue) as CarbonEmissionValue,
        SUM(c.OriginalValue) as OriginalValue,
        c.EmissionSourceCategoryId,
        c.EmissionSourceCategory,
        c.EmissionSourceSubCategory
FROM c
WHERE c.Year = 2023 AND c.BusinessUnitId = @businessUnitId -- 指定分区键
GROUP BY    c.BusinessUnitId,
            c.OrganizationId, 
            c.Year, 
            c.Month, 
            c.EmissionSourceCategoryId,
            c.EmissionSourceCategory,
            c.EmissionSourceSubCategory

3. 验证索引命中

修改索引和查询后,通过CosmosDB门户的查询指标查看:

  • Index hit document count应等于符合条件的文档数(70万左右,若指定单个分区则为该分区内2023年的文档数)
  • Request Charge会显著降低,因为避免了全表扫描

额外优化建议

  • 如果需要跨多个分区查询,不要使用无分区键的跨分区聚合,而是通过应用层遍历每个分区键值,执行单分区查询后再聚合结果,这样能保持每个查询的索引命中率和低费用。
  • 确保GROUP BY的字段顺序与复合索引中对应字段的顺序一致,进一步提升索引匹配效率。

内容的提问来源于stack exchange,提问作者wmmhihaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:22:40