Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure Cosmos DB-在如何为查询提供分区键方面存在差异?_C#_Azure_Azure Cosmosdb - Fatal编程技术网

C# Azure 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

我正在从我的.NET核心应用程序查询Cosmos DB集合。现在我想知道,在如何为查询提供分区键方面是否有任何区别(即:最好是一种方式而不是另一种方式)

下面,
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) });