对相同数据的相同查询消耗两次调用之间的RU

时间:2020-09-28 21:27:29

标签: azure-cosmosdb

我们有一个cosmos db容器,用于插入文档(仅追加)。我们看到,即使匹配文档的数量没有变化,同一查询也会消耗大量变化的RU。我可以在Data Explorer中复制。

查询:

        result = api.responseText
        found = false
        number = parseInt(args[0])

        for (var i = 0; i < result.length; i++){
            if(result[i].playing <= number) {
                message.reply("found candidate")
                found = true
            } else {
                if (i == result.length - 1) {
                    message.reply("no candidate found.")
                }
            }
        }

PartitionKeyPath = / Id

当它在DataExplorer中连续执行时,我得到以下查询统计信息:

  1. 请求费用= 4857.38 RUs,索引查找时间= 9562.75 ms,检索到的文档数= 77
  2. 请求费用= 1900.79 RUs,索引查找时间= 466.72 ms,检索到的文档数= 77
  3. 请求费用= 1878.25 RUs,索引查找时间= 548.80 ms,检索到的文档数= 77

请注意RU和索引查找时间的变化(请参阅带有剩余数据的实际屏幕截图)。我们的日志显示相同的查询最多需要7964 RU和20秒!

还请注意,然后,当我删除“ order by”子句时,在连续执行时我会开始获得相同的RU。

每个documentation:cosmos db保证对相同数据的相同查询在重复执行时始终花费相同数量的RU。为什么我们看到这些变化?

screen capture from Data Explorer - attempt 1 screen capture from Data Explorer - attempt 2

1 个答案:

答案 0 :(得分:0)

我首先要回答为什么要花这么长时间。原因是您需要添加一个composite index。您应该始终探索添加复合索引以优化ORDER BY查询。它们会产生巨大的影响。

关于我们文档RU部分中的保证,一般指导原则在99%的时间内都是正确的,但我们不能保证。我们将对此进行更简洁的更新。

为什么RU / s不同,根据您共享的查询指标,较便宜的1,878 RU查询的索引查找时间为548毫秒,而较昂贵的4,857 RU查询的索引查找时间为9+。这可能是为什么RU差异如此之大的暗示,但无法确定为什么在操作中没有活动ID的原因。

查询引擎在执行过程中会使用很多启发式方法,在某些情况下,小的更改可能会对查询结果产生重大影响。甚至诸如节流之类的事情都可能将查询拆分为不一致的页数,从而影响RU费用。这很少见,但有可能。