【问题标题】:Cosmos DB High Query ChargeCosmos DB 高额查询费用
【发布时间】:2020-07-26 13:03:59
【问题描述】:

我在 Autopilot 模式下使用 Cosmos DB,在 Collection 中将最大 RU/s 设置为 20K RU/s。我正在使用 SQL API。我在这个特定分区中有几十万条记录。我有默认的索引策略,即所有内容都被索引。我已进入 Azure 门户中的数据资源管理器并运行了以下查询:

SELECT count(1) FROM c where c.partitionKey = "12140" and c.uniqueId = "20cdb686-6959-4ed6-ac31-c7f414238f68" and c.timestampAsString = null

查询统计数据显示 RU/s 费用为 3.46。这太棒了!

然后我运行一个非常相似的查询,但我正在测试 c.timestampAsString 是否不为空:

SELECT count(1) FROM c where c.partitionKey = "12140" and c.uniqueId = "20cdb686-6959-4ed6-ac31-c7f414238f68" and c.timestampAsString != null

上述查询的总 RU/s 费用为 2989.73 RU/s。这是相当高的一点。我期待着原始查询的内容。

谁能解释为什么这些查询费用如此不同?

【问题讨论】:

  • 嗯。使用IS_NULL(c.timestampAsString)NOT IS_NULL(c.timestampAsString) 时,您会得到相同类型的结果差异吗?
  • @David Makogon,我希望你能看到这个。是的,NOT IS_NULL 的 RU/s 费用与 != null 相同。
  • 还有一个问题:这是最新的索引推出,还是旧的集合? (刚刚发布了一个发布 + 公告)显式调用的优化之一 (article link) 是不等式运算符。
  • 这是一个两个月前的集合,所以它早于这次改进。您引用的文章建议在相关属性上添加索引。我正在使用索引所有内容的默认索引策略。我可以添加一个显式的附加索引吗?
  • 我不是 100% 肯定这些更新适用于当前集合(至少立即);我必须调查的事情。而且我很确定,如果您已经设置了自动索引,则不需要显式添加索引。适用于不等式的文章的关键部分:“如果存在不等式过滤器或未定义值上的过滤器,则查询引擎将需要加载这些文档中的每一个。由于不等式过滤器和未定义值上的过滤器现在使用索引,我们可以避免加载这些文档并看到 RU 费用的显着改善。"

标签: azure azure-cosmosdb


【解决方案1】:

RU 中这种巨大差异的原因是我们如何/是否将过滤器下推到索引。对于像 c.timestampAsString = null 这样的查询,我们确实将其推送到索引。对于您进行聚合和过滤的查询,例如 c.timestampAsString != null 我们不这样做。

您可以做一些事情来优化这个查询。如果您创建第二个名为“istimestampAsStringNull”的属性并将其设置为 true 到 false,这将使您能够执行以下查询,并且您应该获得大致相同的 RU/s 成本。

SELECT count(1) FROM c where c.partitionKey = "12140" and c.uniqueId = "20cdb686-6959-4ed6-ac31-c7f414238f68" and c. isTimestampAsStringNull == false

我们正在考虑未来的优化,但目前上述解决方法应该可行。

希望这有帮助。

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多