performance - 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。在简单的场景中,我看到的结果与作者相同。但是,如上所述,我的工作场景更复杂。
解决方案
维克多,欢迎来到 StackOverflow!我来自 Cosmos DB 工程团队。
在此特定查询中,由于所有过滤谓词都是交集 (AND),而不是联合 (OR),因此 Cosmos DB 将缩小要评估的文档集,并且不会进行完整扫描。请确保所有 4 个字段(/ManufacturerIdUpperCase、/Owner/Type、/OwnerIdUppererCase、/BoatType)都已编入索引(作为 indexingPolicy 中“includedPaths”的一部分添加)。
推荐阅读
- spark-streaming - 增量表合并操作期间的 java.lang.NullPointerException
- c# - WPF 我无法以我的风格访问文本块
- python - 我正在从 2 列创建字典。我表中的值需要拆分为 lat 和 long 然后放回字典
- python - 如何在 fasta 文件的每个标题中附加文件名?
- react-native - 基于 redux 状态有条件地在选项卡导航器中渲染不同的堆栈导航器
- apache-kafka - 一个代理节点宕机后,Kafka Connect 失败
- javascript - 未检测到 React service-worker
- azure - 如何在 Azure 搜索中获取非文本字段的 PII 实体
- c# - 当行为空白时如何停止foreach循环
- python - 不使用 beautifulsoup 抓取网站数据