【问题标题】:Azure Cosmos DB - difference in how the partition key is supplied to query?Azure Cosmos DB - 为查询提供分区键的方式有何不同?
【发布时间】:2020-01-03 13:48:49
【问题描述】:

我正在从我的 .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# azure azure-cosmosdb


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      是的,有区别。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        相关资源
        最近更新 更多