Cosmos DB Query使用OR时添加RUs



我有一个简单的核心sql查询,获取行计数。如果我分别做EXISTS和IN,它大约是2/3ru,但是如果我做一个(EXISTS "OR"IN)——我甚至可以做(EXISTS "OR"TRUE),然后跳到45RU。对我来说,做2个不同的查询比1个查询更有意义。为什么OR会导致RU消耗上升?

这些是我的查询,我已经尝试过了。

SELECT VALUE COUNT(1) FROM ROOT r.  -- 850 rows, 2-3RUs
SELECT VALUE COUNT(1) FROM ROOT r WHERE IS_NULL(r.deletedAt) -- 830 rows, 2-3RUs
SELECT VALUE COUNT(1) FROM ROOT r WHERE IS_NULL(r.deletedAt) AND r.id IN (......). 830 rows, 2-3RUs
SELECT VALUE COUNT(1) FROM ROOT r WHERE IS_NULL(r.deletedAt) AND EXISTS(SELECT s FROM s IN r.shared WHERE s.id = ID) -- 840rows, 2-3RUs
SELECT VALUE COUNT(1) FROM ROOT r WHERE IS_NULL(r.deletedAt) AND (EXISTS(SELECT s FROM s IN r.shared WHERE s.id = ID) OR r.id IN (...)) -- 840rows,  45RUs

这也在Microsoft Q/A中交叉列出。

免责声明:我没有关于CosmosdB引擎的内部视图,下面只是一个一般的猜测。

虽然在数据基数、如何建立索引以及是否/如何修剪谓词树方面可能涉及一些技巧,但总的来说,OR是一个更难的查询并不奇怪。你不能有一个覆盖索引OR-谓词,这需要数据查找。

仅用于索引覆盖的ANDs,基本上:

  1. 从索引中获取可索引谓词的匹配项并取交集。
  2. <
  3. 返回计数/gh>

使用OR-s不能单独处理索引:

  1. 从索引中获取可索引谓词的匹配项并取交集。
  2. 查找文件(或所需部件)
  3. 在所有匹配文档上计算不可索引谓词(如A OR B)
  4. <
  5. 返回计数/gh>

显然,后者需要更多的计算和内存。因此,更高的RU。查询引擎可以做各种各样的技巧,但事实是,他们必须获得额外的数据,以确保您的"硬"。要考虑谓词

顺便说一句,如果对RU不满意,那么你应该经常检查哪些/如何应用索引,以及是否可以通过设置不同的索引来改进任何东西。参见:在Azure Cosmos DB中索引指标。

更复杂的查询有更高的RU仍然是值得期待的。

最新更新