Azure Cosmos DB-提供分区键以进行查询的方式不同吗?

时间:2020-01-03 13:48:49

标签: 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));

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),反之亦然?!

2 个答案:

答案 0 :(得分:2)

当您在查询中指定分区键时,Cosmos会将查询路由到指定的分区,从而提高执行效率。

您可以通过在问题中显示的两种方式指定分区键,方法是将其添加到WHERE子句as described in this article,也可以使用QueryRequestOptions明确指定分区键。 / p>

在后台,这两种操作都将由数据库引擎以相同的方式处理,并且查询将直接针对您指定的分区执行,因此两者的RU成本应相似。

唯一的实际区别是,在某些情况下,您使用的API的客户端SDK可能会要求您使用QueryRequestOptions指定分区键,或使用相关属性启用跨分区查询。在这种情况下,出于性能原因,您肯定要指定分区键。

答案 1 :(得分:1)

是的,有区别。

根据文档和最佳实践,第二种方法是编写查询的最佳方式,因为CosmosDB SDK本身知道分区键,而第一种倾向于创建不需要的交叉分区。