C# Azure Cosmos DB-在如何为查询提供分区键方面存在差异?
我正在从我的.NET核心应用程序查询Cosmos DB集合。现在我想知道,在如何为查询提供分区键方面是否有任何区别(即:最好是一种方式而不是另一种方式) 下面,C# Azure Cosmos DB-在如何为查询提供分区键方面存在差异?,c#,azure,azure-cosmosdb,C#,Azure,Azure Cosmosdb,我正在从我的.NET核心应用程序查询Cosmos DB集合。现在我想知道,在如何为查询提供分区键方面是否有任何区别(即:最好是一种方式而不是另一种方式) 下面,region是我的分区键 (a) var queryString=$“从c中选择TOP100*,其中c.region='{region}'; var query=this.container.getItemQueryInterator(新的QueryDefinition(queryString)); (b) var queryStrin
region
是我的分区键
(a)
var queryString=$“从c中选择TOP100*,其中c.region='{region}';
var query=this.container.getItemQueryInterator(新的QueryDefinition(queryString));
(b)
var queryString=“从c中选择前100名*”;
var query=this.container.getItemQueryInterator(新的QueryDefinition(queryString),requestOptions:new QueryRequestOptions(){PartitionKey=new PartitionKey(region)});
至少RU(请求单元)看起来是一样的,所以Cosmos DB可能会在内部优化查询,并将a)重写为b)或者反之亦然 当您将分区键指定为查询的一部分时,Cosmos会将查询路由到指定的分区,从而提高执行效率 您可以通过在问题中显示的两种方式指定分区键,一种是将其添加到WHERE子句,另一种是使用 在后台,数据库引擎将以相同的方式处理这两个问题,查询将直接针对您指定的分区执行,因此这两个问题的RU成本应该相似
唯一真正的区别是,在某些情况下,您正在使用的API的客户端SDK可能要求您使用QueryRequestOptions指定分区键,或者使用相关属性启用跨分区查询。在这种情况下,出于性能原因,您肯定要指定分区键。是的,这是有区别的 根据文档和最佳实践,第二种方法是编写查询的最佳方法,因为CosmosDB SDK本身知道分区键,而第一种方法倾向于创建不必要的跨分区
var queryString = $"SELECT TOP 100 * FROM c WHERE c.region ='{region}'";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString));
var queryString = "SELECT TOP 100 * FROM c";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(region) });