我在自动驾驶仪模式下使用Cosmos DB,并且在集合中将最大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。这要高得多。我期待与原始查询类似的东西。
谁能解释为什么这些查询费用如此不同?
答案 0 :(得分:1)
RU中如此巨大的差异的原因是我们如何/是否将过滤器向下推至索引。对于类似c.timestampAsString = null的查询,我们会将其下推到索引。对于您在其中进行聚合和过滤的查询(例如c.timestampAsString!= null),我们不会这样做。
但是您可以做一些事情来优化此查询。如果您创建另一个名为“ istimestampAsStringNull”的属性并将其设置为false,这将使您能够执行以下查询,并且您应该获得大致相同的RU / s费用。
for x in Path('.').iterdir():
try:
if os.listdir(x): # if list is not empty
# do what I have to do
except: pass
我们正在考虑将其用于未来的优化,但目前,上面的解决方法应该可行。
希望这会有所帮助。