sil*_*ent 7 c# azure azure-cosmosdb
我正在从 .NET Core 应用程序查询 Cosmos DB 集合。现在我想知道,在如何向查询提供分区键方面是否有任何区别(即:以一种方式与另一种方式相比更好)?
下面region是我的分区键。
A)
var queryString = $"SELECT TOP 100 * FROM c WHERE c.region ='{region}'";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString));
Run Code Online (Sandbox Code Playgroud)
b)
var queryString = "SELECT TOP 100 * FROM c";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(region) });
Run Code Online (Sandbox Code Playgroud)
至少 RU(请求单位)看起来是相同的,所以 Cosmos DB 可能会在内部优化查询并将 a) 重写为 b),反之亦然?!
小智 7
当您指定分区键作为查询的一部分时,Cosmos 会将查询路由到指定的分区,从而提高执行效率。
您可以通过问题中显示的两种方式指定分区键,将其添加到 WHERE 子句(如本文所述) ,或者可以使用QueryRequestOptions显式指定分区键。
在幕后,数据库引擎将以相同的方式处理这两种情况,并且查询将直接针对您指定的分区执行,因此两者的 RU 成本应该相似。
唯一真正的区别是,在某些情况下,您所使用的 API 的客户端 SDK 可能要求您使用 QueryRequestOptions 指定分区键或使用相关属性启用跨分区查询。在这种情况下,出于性能原因,您肯定要指定分区键。