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

为什么指定分区键时Azure Cosmos查询具有更高的RU?

宋耀
2023-03-14

我有一个与此类似的问题。基本上,我一直在测试使用分区键的不同方法,并且注意到在任何时候,查询中引用的分区键越多,RU就越高。这是非常一致的,甚至不知道如何使用分区键。因此,我将其缩小到用于测试的基本查询。

首先,这个数据库有大约85万个文档,大小都超过1KB。分区键基本上是数字形式的id的100模数,设置为/partitionKey,容器使用默认的索引策略:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/\"_etag\"/?"
        }
    ]
}

这是我的基本查询测试:

SELECT c.id, c.partitionKey
FROM c
WHERE c.partitionKey = 99 AND c.id = '99999'
-- Yields One Document; Actual Request Charge: 2.95 RUs
SELECT c.id, c.partitionKey
FROM c
WHERE c.id = '99999'
-- Yields One Document; Actual Request Charge: 2.85 RUs

Azure Cosmos留档表示如果没有分区键,查询将“散开”到所有逻辑分区。因此,我完全期望第一个查询针对单个分区,第二个查询针对所有分区,这意味着第一个查询应该具有较低的RU。我想我正在使用RU结果作为Cosmos是否散开并扫描每个分区的证据,并将其与留档所说的应该发生的情况进行比较。

我知道这些结果只有0.1个罗斯的差异。但是我的观点是,查询越复杂,差别就越大。例如,下面是另一个稍微复杂一点的查询:

SELECT c.id, c.partitionKey
FROM c
WHERE (c.partitionKey = 98 OR c.partitionKey = 99) AND c.id = '99999'
-- Yields One Document; Actual Request Charge: 3.05 RUs

请注意,RUs继续增长,并与完全没有指定分区键的情况相分离。相反,我希望上面的查询只针对两个分区,相比之下,没有分区键检查应该会分散到所有分区。

我开始怀疑分区密钥检查发生在其他过滤器之后(或每个分区扫描内部)。例如,返回第一个查询,但将id更改为不存在的内容:

SELECT c.id, c.partitionKey
FROM c
WHERE c.partitionKey = 99 AND c.id = '99999x'
-- Yields Zero Documents; Actual Request Charge: 2.79 RUs
SELECT c.id, c.partitionKey
FROM c
WHERE c.id = '99999x'
-- Yields Zero Documents; Actual Request Charge: 2.79 RUs

请注意,RU完全相同,并且两者(包括带有分区过滤器的RU)的RU比文档存在时少。这似乎是分区过滤器对结果执行的症状,而不是限制扇出。但这不是文件所说的。

为什么在指定分区键时 Cosmos 具有更高的 RU?

共有1个答案

连厉刚
2023-03-14

就像注释指定的那样,如果您通过门户(或通过代码,但使用您提供的查询)进行测试,则会变得更昂贵,因为您不是查询特定分区,而是查询所有内容,然后引入另一个过滤器,这会更昂贵。

相反,您应该做的是 - 在代码中使用正确的方式传入分区键。我的结果非常令人印象深刻:PK为3 ru,没有PK的参数为20.000 ru,因此我对intworks非常有信心(我有一个非常大的数据集)

 类似资料:
  • 我正在DynamoDB中设计一个表,它将包含大量记录,每个记录都有一个唯一的ID和一个时间戳。我需要检索一组位于两个日期之间的记录,而不管所有其他属性值如何。 为时间戳字段添加全局辅助索引似乎是一个合乎逻辑的解决方案,但这并不简单。 DynamoDB中的Query命令需要一个KeyConditionExpression参数,该参数确定查询返回的结果。从DynamoDB开发人员指南: 要指定搜索条件

  • 与主键、复合键和候选键相比,dynamodb中的分区键和排序键是什么?

  • 问题内容: 我有一个配置单元表,该配置表按年,月,日和小时划分。我需要对其执行查询以获取最近7天的数据。这是在。我的查询当前看起来像这样: 这需要很长时间。当我用上面的实际数字代替时,请说: 它会在几分钟内完成。有什么办法可以更改上面的脚本,以便实际上只包含查询中的数字而不是函数? 我尝试使用像: 但这不能解决问题。 问题答案: 解决方案 原始查询出了什么问题? unix_timestamp()

  • 问题内容: 我在通用表“ Sample”上构建查询,并且有几种类型从该表“ SampleOne”,“ SampleTwo”继承。我需要类似的查询: 其中type是表的鉴别值。是否可以通过任何方式(并且避免创建实体特定的查询,每个SampleOne,SampleTwo …等等) 我非常感谢您对本主题的任何投入, 亲切的问候,P。 问题答案: 在JPA 2.0中,您可以使用表达式(尽管当前它不适用于H

  • 为什么在使用sql api SDK对分区集合进行点查询时必须提到分区键? 有没有办法使用sql api SDK对分区集合执行点查询而不提及“分区键”?因为它是点查询。 工作示例: // - db_id是数据库的 ID 属性 // - coll_id是文档集合的 ID 属性 // - doc_id是文档希望读取的 ID 属性 doc_id coll_id db_id 。 非工作示例:var docU

  • 我想针对已使用的RU优化我的Azure Cosmos DBSQLAPI查询(部分原因是为了减少429个响应的频率)。 具体来说,我认为在WHERE子句中包含分区键将减少消耗的ru(例如,我阅读了https://docs . Microsoft . com/en-us/azure/cosmos-db/optimize-cost-queries和https://docs . Microsoft . c