给出以下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)
答案 0 :(得分:0)
Victor,欢迎来到StackOverflow!我来自Cosmos DB工程团队。
在此特定查询中,由于所有过滤器谓词都是交集(AND),而不是并集(OR),因此Cosmos DB将缩小要评估的文档集,并且不会进行全面扫描。请确保所有4个字段(/ ManufacturerIdUpperCase,/ Owner / Type,/ OwnerIdUppererCase,/ BoatType)都已编入索引(在indexingPolicy中作为“ includedPaths”的一部分添加)。