首页 > 解决方案 > CosmosDb SQL 查询中是否存在单个 UPPER 会强制对分区进行完整的集合扫描?

问题描述

给定以下 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:内置字符串函数(如 UPPER)的性能影响

标签: performanceazure-cosmosdb

解决方案


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

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


推荐阅读