首页 > 解决方案 > Cosmos DB "In" 运算符 SQL 查询

问题描述

我需要根据批处理请求中的唯一键按文档(cosmos DB)查询。

我对上述要求的方法

  1. 由于我的密钥说 customerId 是唯一的,因此我将 customerId 作为 Id 并将分区密钥也作为 /id。
  2. 由于它的批量读取请求(25 个调用/每个请求和 10 个批量请求/秒),我在 SQL 查询中使用“in”运算符并通过 CosmosClient.CreateDocumentQuery 函数提取所有文档 例如:我的 SQL 查询看起来像“Select *从 c where c.Id in ('a1','b1')
  3. 以下是我的提要选项:

    新 FeedOptions { MaxItemCount = -1,EnableCrossPartitionQuery = true,MaxDegreeOfParallelism = -1,MaxBufferedItemCount = -1 }

基于以上场景:

  1. 我实际上是否很好地利用 Id 查询功能来实现更快的响应时间?

  2. EnableCrossPartitionQuery 在当前场景中是否有意义?

  3. 我做的分区对吗?

有没有更好的方法可以利用提取数据的能力是键值对方式?

标签: azure-cosmosdb

解决方案


1.EnableCrossPartitionQuery 在当前场景下有意义吗?

是的。由于您的分区键是唯一的 id,因此您需要EnableCrossPartitionQuery =true确保在查询id列时查询可以扫描所有分区。

2.我实际上是否很好地利用了 Id 查询功能来实现更快的响应时间?我在做分区吗?

根据您在问题中提到的场景,我相信您已经阅读了在 cosmos db 中选择分区键的概述。由于您设置MaxItemCount= -1(返回所有过滤器数据而不分页),您必须按照提到的规则平衡 RUs 设置在上面的链接中:

Azure Cosmos 容器的最小吞吐量为每秒 400 个请求单位 (RU/s)。在数据库上预配吞吐量时,每个容器的最小 RU 为每秒 100 个请求单位 (RU/s)。对同一分区键的请求不能超过分配给分区的吞吐量。如果请求超过分配的吞吐量,则请求会受到速率限制。因此,选择一个不会导致应用程序中出现“热点”的分区键很重要。

如果你不想提高 RUs 设置,你可以考虑设置MaxItemCount = some pagesize 并加载所有数据continuation token

3.有没有更好的方法可以利用提取数据的能力是键值对方式?

如果您的 deviceIds 有一些通用的命名规则,也许您可​​以考虑以下 2 个想法:

1.根据本文档调整devideId的索引策略:https ://docs.microsoft.com/en-us/azure/cosmos-db/index-policy

2.尝试通过以下链接创建合成分区键:https : //docs.microsoft.com/en-us/azure/cosmos-db/synthetic-partition-keys,例如,在devideId前添加一些后缀。


推荐阅读