首页 > 解决方案 > 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) 或反之亦然?!

标签: c#azureazure-cosmosdb

解决方案


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

您可以通过在问题中显示的两种方式指定分区键,或者通过将其添加到本文所述的 WHERE 子句中,或者您可以使用QueryRequestOptions显式指定分区键。

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

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


推荐阅读