Azure CosmosDb中分区键的使用情况



直到现在,我使用Linq to SQL对我的ComosDb数据库进行查询,它工作得很好,我不必传递分区键。然而,我现在必须编写一个更复杂的查询,它在多个字段上搜索产品,所以我决定写入存储过程,这里我必须传递分区键来执行它。

  • 为什么在某些情况下传递分区键是强制性的,而在其他情况下不是?

在我的用例中,我有一个包含产品对象的集合,这些产品对象都具有supplierId属性,该属性是分区键,而catalogId属性包含该产品可用的所有目录的数组。在我的API中,我要求catalogId搜索产品,但不搜索供应商,因为它是冗余的。当然,我可以先使用catalogId检索supplierId,然后将其传递给调用Cosmosdb的方法,但我真的不喜欢它,因为这意味着我的应用层应该知道基础设施的工作方式。

  • 你对如何管理分区键的依赖有一些建议吗?或者也许我没有按照cosmosdb的最佳实践以最好的方式建模我的数据层?

如果分区键作为过滤器谓词(where)发送,Linq可能能够推断出分区键,这就是为什么您不需要指定它的原因。但是如果你不传递它,Linq会很高兴地运行一个扇形输出查询,这种查询在大规模执行时是缓慢和低效的,在高请求量时绝对避免。

存储进程的作用域是一个分区键,所以需要传递它。

如果你在这里做查询,我不会使用存储过程,因为它们只在主副本上执行,所以只能访问配置的吞吐量的1/4。使用SDK的常规查询可以访问4个副本中的任何一个,从而更好地利用吞吐量。这对于高并发性查询尤其重要,但无论如何,您都应该以提高效率为目标。

因此,如果这确实是一个跨分区查询,并且您没有为一个经常执行的查询传递supplerid,那么您可能需要查看您的分区策略并分析您对数据的访问模式,以确保您正在设计一个可扩展且高效的数据库。

最新更新