我有一个简单的核心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
-谓词,这需要数据查找。
仅用于索引覆盖的AND
s,基本上:
- 从索引中获取可索引谓词的匹配项并取交集。 <
- 返回计数/gh>
使用OR
-s不能单独处理索引:
- 从索引中获取可索引谓词的匹配项并取交集。
- 查找文件(或所需部件)
- 在所有匹配文档上计算不可索引谓词(如
A OR B
) < - 返回计数/gh>
显然,后者需要更多的计算和内存。因此,更高的RU。查询引擎可以做各种各样的技巧,但事实是,他们必须获得额外的数据,以确保您的"硬"。要考虑谓词
顺便说一句,如果对RU不满意,那么你应该经常检查哪些/如何应用索引,以及是否可以通过设置不同的索引来改进任何东西。参见:在Azure Cosmos DB中索引指标。
更复杂的查询有更高的RU仍然是值得期待的。