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

如何通过.NET SDK查询CosmosDB分区大小及规划归档策略?

Cosmos DB Core/SQL API分区大小查询与自动归档方案

一、通过.NET SDK查询分区大小

Cosmos DB没有直接返回分区大小的API,但可以通过以下两种方式实现:

1. 基于PartitionKeyRange获取精准存储统计

每个分区对应一个PartitionKeyRange,通过SDK获取这些范围的存储使用数据是最精准的方式:

using Microsoft.Azure.Cosmos;
using System.Linq;

var cosmosClient = new CosmosClient("你的连接字符串");
var container = cosmosClient.GetContainer("数据库ID", "容器ID");

// 获取容器所有分区键范围
var partitionKeyRanges = await container.GetPartitionKeyRangesAsync().ToListAsync();

foreach (var range in partitionKeyRanges)
{
    var stats = await container.GetPartitionKeyRangeStatisticsAsync(range.Id);
    // 转换为GB单位
    var sizeInGb = stats.StorageUsage / (1024.0 * 1024.0 * 1024.0);
    Console.WriteLine($"分区ID: {range.Id}, 键范围: {range.MinInclusive}~{range.MaxExclusive}, 大小: {sizeInGb:F2} GB");
}

如果要查询指定分区的大小,先通过分区键值解析出对应的PartitionKeyRange ID,再查询统计:

var targetPartitionKey = new PartitionKey("你的目标分区键值");
var partitionRangeId = await container.ResolvePartitionKeyAsync(targetPartitionKey);
var specificStats = await container.GetPartitionKeyRangeStatisticsAsync(partitionRangeId);
var sizeInGb = specificStats.StorageUsage / (1024.0 * 1024.0 * 1024.0);
Console.WriteLine($"指定分区大小: {sizeInGb:F2} GB");

2. 通过查询估算分区大小(仅作参考)

如果不需要绝对精准,可以针对目标分区执行计数+平均文档大小的估算,适合数据量较小的场景:

var queryDef = new QueryDefinition("SELECT VALUE COUNT(1) FROM c WHERE c.partitionKey = @pk")
    .WithParameter("@pk", "你的目标分区键值");

var queryIterator = container.GetItemQueryIterator<long>(queryDef);
var countResponse = await queryIterator.ReadNextAsync();
var docCount = countResponse.First();

// 假设平均每个文档大小为1KB(根据实际情况调整)
var estimatedSizeInGb = (docCount * 1024) / (1024.0 * 1024.0 * 1024.0);
Console.WriteLine($"估算分区大小: {estimatedSizeInGb:F2} GB");

注意:这种方式忽略了索引、元数据的存储占用,结果会比实际值偏小。

二、自动归档策略的实现思路

针对主分区接近20GB时的归档需求,可以按以下步骤实现:

1. 监控触发逻辑

  • 用定时任务(比如Azure Functions定时器、Windows服务)定期查询主分区的存储大小,当达到阈值(比如18GB,留足缓冲空间)时触发归档。
  • 建议直接使用PartitionKeyRange的统计数据作为触发依据,避免估算误差。

2. 归档执行流程

  • 批量迁移旧数据:针对主分区中符合归档条件的数据(比如按createTime过滤3个月前的记录),用Cosmos DB的批量API(BulkExecutor)读取并写入归档分区/容器。归档分区的键可以设计为archive-原分区键,或者单独创建归档容器统一存储。
  • 批量删除原数据:迁移完成后,批量删除主分区中的已归档数据,确保释放空间。
  • 幂等性保障:给已归档的文档添加isArchived标记,或者用时间范围+分区键作为唯一标识,避免重复执行归档时重复迁移。

3. 关键注意事项

  • 批量操作优化:使用批量API可以大幅提升迁移效率,减少请求次数,避免触发速率限制。
  • 索引优化:归档容器可以配置更精简的索引策略(比如只保留必要的查询字段),降低存储占用。
  • 事务控制:如果需要迁移和删除的原子性,可以使用Cosmos DB的事务批量操作,但注意事务有100MB的大小限制,大体积归档需要拆分批次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:37:37