azure Cosmos db的复合索引未改善RU使用率

xmd2e60i  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(86)

Azure通知我,我的一个查询由于ORDER BY子句而无法执行,添加复合索引将大大受益。我已经做了大量的阅读,并反复尝试为这个查询添加复合索引,但不幸的是,我的查询的罗斯没有得到改进,或者只是稍微增加了一些。
我对我的查询有以下几点:

WHERE
     p.BusinessId = 'id' AND
     p.PurchaseDate >= '2018-07-04T16:26:42.0882176-06:00' AND p.PurchaseDate < '2023-07-10T15:26:42.0882176-06:00' AND
     NOT Contains(LOWER(p.TransactionIdentifier), 'history')
ORDER BY p.PurchaseDate DESC

字符串
根据我所做的所有阅读,我应该有两个复合索引,a(businessId,purchaseDate降序)和a(businessId,transactionIdentifier)。因为每个复合索引只能有一个范围或函数,而我有两个,所以我需要两个索引。然而,这并不起作用,因为它抱怨没有匹配的复合索引。它唯一没有抱怨的配置是(businessId,purchaseDate降序,transactionIdentifier),它实际上增加了运行查询所需的罗斯。
文档还指出,我应该在我的ORDER BY中包含这些过滤器,以提高性能。我也试过添加这些。似乎没有什么能给予我减少罗斯。
我一直在尝试沿着以下资源,但我只是没有取得进展:

我被卡住了。有人能帮我找出这个查询的正确组合索引配置吗?

bhmjp9jg

bhmjp9jg1#

原因是
我很确定这种情况下不能利用索引:第一个月
LOWER function documentation开始:

*此函数不使用索引。

  • 如果您计划执行频繁的不区分大小写的比较,则此函数可能会占用大量罗斯。在接收数据时,请考虑规范化字符串的大小写。然后,类似SELECT * FROM c WHERE LOWER(c.name)= 'USERNAME'的查询将简化为SELECT * FROM c WHERE c.name = 'USERNAME'。

一个旁注,不必显式使用TOLOWER,see CONTAINS function
CONTAINS(<string_expr_1>, <string_expr_2> [, <bool_expr>])
bool_expr(可选)-忽略大小写的可选布尔值。如果设置为true,CONTAINS将执行不区分大小写的搜索。如果未指定,则此值默认为false。
坏消息再次出现在备注中:

此功能执行完全扫描。

虽然我已经看到了这些函数能够利用index的提示(参见here),但当前的文档并没有这么说。无论哪种方式,你也有NOT,这可能打破了交易无论如何。
因此-没有索引用于此。
你能做什么

重新思考您的数据模型

也就是说,预先计算一个布尔IsTransactionHistory或类似的模型和有效的索引选项亮起。这是获得良好性能而没有拖后腿的首选方法。

从索引中排除TransactionIdentifier

因为它不能使用,只会使索引更庞大,匹配更少=成本更高。

您最好选择(p.BusinessId, p.PurchaseDate)上最简单索引

根据数据的基数和参数模式,我还可以尝试在PurchaseDate上使用更简单的索引。如果您查询的日期范围非常窄,并且切片中的错误BusinessId-s非常少,则效果可能会更好。

别理它。

有时候,忽略低效率并购买那几个额外的RU在经济上是可行的。很少,但你算算。

相关问题