我正在从.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));
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),反之亦然?!
答案 0 :(得分:2)
当您在查询中指定分区键时,Cosmos会将查询路由到指定的分区,从而提高执行效率。
您可以通过在问题中显示的两种方式指定分区键,方法是将其添加到WHERE子句as described in this article,也可以使用QueryRequestOptions明确指定分区键。 / p>
在后台,这两种操作都将由数据库引擎以相同的方式处理,并且查询将直接针对您指定的分区执行,因此两者的RU成本应相似。
唯一的实际区别是,在某些情况下,您使用的API的客户端SDK可能会要求您使用QueryRequestOptions指定分区键,或使用相关属性启用跨分区查询。在这种情况下,出于性能原因,您肯定要指定分区键。
答案 1 :(得分:1)
是的,有区别。
根据文档和最佳实践,第二种方法是编写查询的最佳方式,因为CosmosDB SDK本身知道分区键,而第一种倾向于创建不需要的交叉分区。