当前位置: 首页 > 知识库问答 >
问题:

为什么在Cosmos SQL API查询的WHERE子句中包含分区键会增加某些查询的消耗RU?

隆康平
2023-03-14

我想针对已使用的RU优化我的Azure Cosmos DBSQLAPI查询(部分原因是为了减少429个响应的频率)。

具体来说,我认为在WHERE子句中包含分区键将减少消耗的ru(例如,我阅读了https://docs . Microsoft . com/en-us/azure/cosmos-db/optimize-cost-queries和https://docs . Microsoft . com/en-us/azure/cosmos-db/partitioning-overview,这使我想到了这一点)。

然而,当我跑的时候

SELECT TOP 1 * 
FROM c
WHERE c.Field = "some value"
AND c.PartitionKeyField = "1234"
ORDER BY c.TimeStampField DESC

它消耗6个RU。

而没有分区密钥。

SELECT TOP 1 * 
FROM c
WHERE c.Field = "some value"
ORDER BY c.TimeStampField DESC

它消耗5.76 RUs,即更便宜。

(虽然根据所选的确切文档,上述数字有一些变化,但第二个查询总是更便宜,我已经针对最小和最大的分区进行了测试。

我的数据库目前有大约400,000个文档和29个分区(预计两者都将增长)。最大的分区大约有150,000个文档(不太可能超过这个数量)。

以上结果表明,我不应该在查询的WHERE子句中传递分区键。请有人解释一下为什么会这样,因为从文档中我认为相反的情况应该是正确的?

共有1个答案

宫坚
2023-03-14

可能有几个原因,这取决于查询引擎决定使用哪个索引,或者是否有索引。

我可以说的第一件事是,这个容器中可能没有太多数据,因为没有分区键的查询越大,容器越大,就越昂贵,特别是当它们跨越物理分区时。

如果分区键上没有索引,并且在按 c.field 筛选后对其进行了扫描,则第一个分区键可能会更昂贵。

它也可能更昂贵,具体取决于是否存在复合索引以及是否使用它。

真的,尽管您不能对小容器进行查询指标并进行推断。衡量的唯一方法是将足够的数据放入容器中。这里的量太小,不值得优化。我会将您期望在生产中拥有的数据量放入这个容器中并重新运行您的查询。

最后,关于测量和优化,帕累托原则适用。你会疯狂地追求每一个优化。找到您的高并发查询并关注它们。

希望这对你有帮助。

 类似资料:
  • 问题内容: 当表开始增长时,我担心WHERE子句中IN的性能。有没有人对这种查询有更好的策略?子查询返回的记录数比TradeLine表中的记录数增长得慢得多。TradeLine表本身以每天10个的速度增长。 谢谢你。 编辑:我使用了将子查询从WHERE移到FROM的想法。我对有助于此新查询的所有答案投了赞成票。 问题答案: 子句中的子查询不依赖于外部查询中的任何内容。您可以安全地将其移到子句中;一

  • 我正在尝试查询嵌入的文档,以获得如下结果: 文件: 我正在尝试使用SQL查询查询上述文档: 预期输出:(当我们使用位置 Id = 14 时,我们需要忽略位置 Id = 16,因为 Id = 1): 不起作用,我没有得到预期的输出,当我使用上述查询时,它给我空的结果。我如何使用嵌入文档上的where子句进行查询?

  • 问题内容: 将SELECT查询放在UPDATE查询的WHERE子句中时出现错误。 我的查询是这样的: AND错误将显示如下: “无法在FROM子句中指定目标表’m’进行更新” 问题答案: 实际上,您可以通过将其包装在子查询中来更新它(从而为结果创建临时表) 或使用 JOIN

  • 问题内容: 谁能给我一些关于如何将这种子查询放入提示?(我正在使用 JPA 2.0 - Hibernate 4.x ) -第二个选择将始终获得单个结果或null。 问题答案: 尝试类似以下示例的操作来创建子查询: 请注意,由于附近缺少IDE,因此该代码尚未经过测试。

  • 问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ

  • 我正在使用Cassandra 1.1.2我正在尝试将RDBMS应用程序转换为Cassandra。在我的RDBMS应用程序中,我有以下名为table1的表: Col1:字符串(主键) 此表对2亿记录进行计数。主要使用的查询如下: 在Cassandra中,我使用以下语句创建表: 我将主键更改为一个额外的列(我计算应用程序中的键)。导入一些记录后,我尝试执行以下cql: 这个结果是: 查询从col3=6