【发布时间】:2020-04-27 19:02:07
【问题描述】:
对于一个项目,我正在考虑使用 Cosmos DB (SQL API) 作为我的数据库解决方案。阅读有关请求单元的文档,我了解到 here 和 here 读取 1 项大小为 1 KB 的项目占用 1 RU(请求单元)。
当我执行下面的查询时(我查询单个分区中的所有项目(性别是 PartitionKey),我得到 5.000 个项目的结果(在 1.000 个项目的五个块中)。每个项目的大小为 1.5 KB,所以每个项目应该超过 1 RU。但是,标题指出 RequestCharge 总共只有 88.12,对于 1.000 个项目。遵循每个大小为 1 KB 的项目 1 RU 的规则,我期望至少 1000 RU .
有人知道如何正确解释RequestCharge 吗?
代码和查询:
public async Task<List<Profile>> GetAllProfilesByGender(string gender)
{
var container = GetContainer();
var queryIterator = GetQueryIterator(container, gender);
var profiles = new List<Profile>();
while (queryIterator.HasMoreResults)
{
var resultSet = await queryIterator.ReadNextAsync();
foreach (var profile in resultSet)
{
profiles.Add(profile);
}
}
return profiles;
}
private FeedIterator<Profile> GetQueryIterator(Container container, string gender)
{
var query = new QueryDefinition($"SELECT * FROM c WHERE c.Gender = '{gender}'");
return container.GetItemQueryIterator<Profile>(query);
}
【问题讨论】:
-
这与您的问题无关,但如果您计划超过 20GB 的大小和/或写入繁重的场景,性别不是一个可以很好地扩展的分区键。您可以通过Partitioning in Cosmos DB了解更多信息
-
@MarkBrown 感谢您的评论。数据库永远不会达到那个大小(最大为 1-2 GB),并且写入操作只会针对单个项目。
-
好的。对于单分区容器而言,重要性不那么重要。谢谢。
-
@MarkBrown 你的评论让我重新思考。也许您可以就这一点提供一些建议?鉴于此容器上的查询将始终至少指定性别(用户查询男性或女性,但绝不会同时查询)和 Profile 文档的某些其他属性的子集(最终用户可以选择过滤 FirstName、City、Education、Profession,在 Gender 旁边)我选择 Gender 作为 PartitionKey,因为它是唯一合适的 PartitionKey,它阻止我进行跨分区查询。您对此有何看法?
-
当然,如果它总是在查询中使用,那么这就是良好分区键的一部分,因为没有分区键的查询将在所有分区中散开。同样,在小型收藏中没什么大不了的。在设计大规模 NoSQL 数据库时,这只是一个设计考虑因素。
标签: azure azure-cosmosdb azure-cosmosdb-sqlapi