CosmosDb SQL查询中是否存在单个UPPER会在分区上强制执行完整集合扫描?

时间:2019-02-27 04:09:40

标签: performance azure-cosmosdb

给出以下SQL,ManufacturerIdUpperCase是分区键,并传递一个小写的值作为将Cosmos定向到正确分区的提示。索引属性中的“ boat.OwnerIdUpperCase”。 Cosmos会使用ownerId将扫描范围缩小到该所有者的文档子集,还是使用其他两个UPPER调用需要完整的集合扫描?

SELECT * FROM boat 
WHERE boat.ManufacturerIdUpperCase= @ManufacturerId
AND UPPER(boat.Owner.Type)= UPPER(@OwnerType) 
AND boat.OwnerIdUppererCase= @BoatOwnerId) 
AND UPPER(boat.BoatType) = UPPER(@BoatType)

我正在尝试确定是否需要维护各种WHERE子句中包含的每个属性的小写副本,或者是否可以对索引属性上剩余的UPPER转换之一进行此操作,这将缩小范围数据集的内容,以便仅对结果子集而不是整个分区进行扫描?

我已经阅读了下面的旧文章,并按照建议在沙盒中运行了SQL。在简单的场景中,我看到的结果与作者相同。但是,如上所述,我的工作场景更加复杂。

DocumentDB: Performance impact of built-in string functions (like UPPER)

1 个答案:

答案 0 :(得分:0)

Victor,欢迎来到StackOverflow!我来自Cosmos DB工程团队。

在此特定查询中,由于所有过滤器谓词都是交集(AND),而不是并集(OR),因此Cosmos DB将缩小要评估的文档集,并且不会进行全面扫描。请确保所有4个字段(/ ManufacturerIdUpperCase,/ Owner / Type,/ OwnerIdUppererCase,/ BoatType)都已编入索引(在indexingPolicy中作为“ includedPaths”的一部分添加)。