1

我在 cosmos 中有一个容器,它由我创建的合成密钥分区,该数据目前大约有 600 万个文档,合成密钥如下:

'InfantCereal-Fct-4WEApr2818' 其中的片段由破折号分隔,分别代表类别、类型和日期

我觉得奇怪的是,当我使用如下类似查询时,我得到的结果是:


SELECT * FROM c where c.Partition LIKE 'InfantCereal-%-4WEApr2818'

Request Charge
316.78 RUs (VERY HIGH)

-----------------------------------------------------

SELECT * FROM c where c.Partition LIKE 'InfantCereal-Fct-%'

Request Charge
17.41 RUs (VERY LOW)

-----------------------------------------------------

SELECT * FROM c where c.Partition LIKE '%-Fct-4WEApr2818'

Request Charge
297.25 RUs (VERY HIGH)

-----------------------------------------------------

SELECT * FROM c where c.Period = '4WE Apr 28 18' 
Request Charge
23.56 RUs

为什么在查询任何日期值时 RU/s 非常低?在这个容器中,日期差异会比类别和类型更多,但我不明白为什么 RU/s 成本如此之高

还有为什么在 Period 上查询时(容器未分区)的 RU/s 成本比查询时少得多?

我对 Cosmos DB 很陌生,我想确保在继续之前我在数据分区方面没有犯任何错误,感谢任何关于 Cosmos RU/Query 成本的解释。

谢谢!

4

1 回答 1

1

您似乎看到了与索引可用于更有效查询的情况相对应的行为。在LIKE 运算符的文档中,注意到这等同于使用 system function RegexMatch。在RegexMatch 文档中,底部有一条注释:

如果正则表达式可以分解为 StartsWith、EndsWith、Contains 或 StringEquals 系统函数,则此系统函数将从范围索引中受益。

这表明当您的查询可以优化为其中一种情况时,您将节省成本。这与您正在记录的内容相匹配。

因此,如果您知道您正在处理其中一种情况,您可能会考虑使用显式函数,STARTSWITH而不是LIKE确保预期的索引处理,如果不是更自我记录的话。

于 2021-07-29T20:38:54.217 回答