当前位置: 首页 > 知识库问答 >
问题:

为什么这个零结果Cosmos DB查询如此昂贵?

夹谷弘亮
2023-03-14

我正在调查为什么我们在宇宙中耗尽了那么多RU。我们的写操作达到了预期的RU数量,但我们的读操作达到了极限——比我们的写操作高出一个数量级。我试着把它剥离到最简单的场景。在没有结果的分区上查询单个请求会使用2000个RU。为什么这么贵?

var query = new QueryDefinition("SELECT * FROM c WHERE c.partitionKey = @partionKey ORDER BY c._ts ASC, c.id ASC")
                    .WithParameter("@partionKey", id.Value)

using var queryResultSetIterator = container.GetItemQueryIterator<MyType>(query,
                requestOptions: new QueryRequestOptions
                {
                    PartitionKey = new PartitionKey(id.Value.ToString()),
                });

while (queryResultSetIterator.HasMoreResults)
            {
                foreach (var response in await queryResultSetIterator.ReadNextAsync())
                {
                    yield return response.Data;
                }
            }

集合的分区键是partitionKey。RU容量直接在容器上设置,而不是共享。我们有一个与where子句匹配的复合索引-\u ts asc,id asc。虽然我不知道这对不返回任何记录有什么影响。

不幸的是,当以这种方式查询时,SDK似乎没有提供已使用的RU,因此我一直在使用Azure monitor观察RU的使用情况。

有没有人能够阐明为什么这个查询,返回零条记录并仅限于单个分区会占用2kRU?

更新:

我刚刚在同一个存储帐户中的另一个数据库实例上运行了这个查询。两者配置相同。DB1有0MB,DB2有44MB。对于完全相同的不返回记录的操作,DB1使用111个RU,DB2使用4730RU——对于相同的无结果查询,这是40多倍。

添加更多细节:一致性设置为一致前缀。这是一个地区。

另一个更新:

我复制了仅通过Azure门户查询的问题,它与容器中的记录数有关。查看查询统计信息,好像它正在加载容器中的每个文档以搜索分区键。分区键不是性能最好的搜索方式吗?宇宙难道不知道在哪里可以找到设计上属于分区键的文档吗?

2445.38 RUs显示结果检索到的文档数:65671检索到的文档大小:294343656字节输出文档数:0输出文档大小:147字节索引命中文档数:0索引查找时间:0毫秒文档加载时间:8804.060000000001毫秒查询引擎执行时间:133.11毫秒系统功能执行时间:0毫秒用户定义功能执行时间:0毫秒文件写入时间:0毫秒

共有1个答案

孔砚
2023-03-14

我最终找到了问题的根源。为了搜索分区键,它需要被索引。考虑到分区键用于决定文档的存储位置,这让我觉得很奇怪,所以你会认为宇宙天生就知道每个分区键的位置。

在索引项列表中包含分区键解决了我的问题。这也解释了为什么随着数据库规模的增长,性能会随着时间的推移而下降——它正在扫描每一个文档。

 类似资料:
  • 使用的解决方案类似于microsoft文档中的内容:https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.documents.linq.documentQueryable.asdocumentQuery?view=azure-dotnet 我们目前正在将我们的数据解决方案转移到cosmosDB,这就是我们如何注意到这个问题的。你知道

  • 两者都将找到答案996没有问题。我们使用modulos来保持合理的输出大小,使用pair来避免指数分支。 对于n=5000,C++代码输出783,但Python会抱怨 如果我们加上几行

  • 问题内容: 我的样子 当我看起来像 我有一条路线 我的控制器看起来像 当我运行我的应用程序时,我看到console.log为 我在这里做错了什么? 问题答案: 是异步的。它立即返回一个空数组,并在响应到达时稍后从请求中添加结果- 来自http://docs.angularjs.org/api/ngResource.$resource: 重要的是要意识到调用$ resource对象方法会立即返回空引

  • 我有以下表格结构: 1-课程(course_id、course_nam、语言、course_price、create_date、average_rating、course_description、certifica_price、course_creator_id) 2-学生(学生证、钱包) 3-折扣(折扣id、折扣课程id、允许的许可课程id、开始日期、结束日期、百分比) 4-报名(student

  • 我写了一个小基准来比较Python、Ruby、JavaScript和C的不同解释器/编译器的性能。正如预期的那样,结果表明(优化的)C打败了脚本语言,但是它的系数非常高。 结果是: 我想知道是否有人能解释为什么优化的C代码比其他代码快三个数量级以上。 C基准测试使用命令行参数以防止在编译时预计算结果。 下面,我放置了不同语言基准测试的源代码,它们应该在语义上是等价的。此外,我提供了优化的C编译器输

  • 我正在我的应用程序中为我的用户添加简单的搜索功能,我强烈考虑使用Azure CosmosDB。my Cosmos数据库(Azure)中的文档表示电话,如下所示: 我将根据每个项中的嵌套属性、和提供搜索能力。我正在考虑使用此查询: 这是执行此类搜索的最有效方法吗?我愿意重组我的文档,以加快在这些字段中的搜索。需要注意的一些事项: 这是一个多租户系统,我们在此特定数据库中使用“每个租户分区”方案。 当