c# - Azure Cosmos DB - 为查询提供分区键的方式有何不同?
问题描述
我正在从我的 .NET Core 应用程序中查询 Cosmos DB 集合。现在我想知道,在我如何为查询提供分区键方面是否有任何区别(即:最好以一种方式而不是另一种方式来做)?
下面,region
是我的分区键。
一个)
var queryString = $"SELECT TOP 100 * FROM c WHERE c.region ='{region}'";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString));
b)
var queryString = "SELECT TOP 100 * FROM c";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(region) });
至少 RU(请求单位)似乎是相同的,所以也许 Cosmos DB 在内部优化了查询并将 a) 重写为 b) 或反之亦然?!
解决方案
当您将分区键指定为查询的一部分时,Cosmos 会将查询路由到指定的分区,从而提高执行效率。
您可以通过在问题中显示的两种方式指定分区键,或者通过将其添加到本文所述的 WHERE 子句中,或者您可以使用QueryRequestOptions显式指定分区键。
在幕后,数据库引擎将以相同的方式处理这两者,并且查询将直接针对您指定的分区执行,因此两者的 RU 成本应该相似。
唯一真正的区别是,在某些情况下,您使用的 API 的客户端 SDK 可能要求您使用 QueryRequestOptions 指定分区键或使用相关属性启用跨分区查询。在这种情况下,出于性能原因,您肯定要指定分区键。
推荐阅读
- python - 使用改变 ImageDataGenerator 输入大小的预处理函数
- docker - 将 TeamCity 内部版本号传递给 Docker 代理
- javascript - NaN 导致 console.log 函数
- c - Microchip C 内联汇编不会为内联汇编中的立即数生成前缀
- rundeck - 没有从 ResourceModelSource 插件中的密钥存储中获取参数
- c++ - 单继承空基优化不适用于 MSVC
- flutter - Flutter 中用于增减的组件
- azure - Azure 存储帐户故障转移
- flutter - 找不到 AndroidManifest.xml
- odbc - 如何为 Teradata 17 配置 ODBC 数据源管理器连接?