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中包含这些过滤器,以提高性能。我也试过添加这些。似乎没有什么能给予我减少罗斯。
我一直在尝试沿着以下资源,但我只是没有取得进展:
- https://learn.microsoft.com/en-us/azure/cosmos-db/index-policy
- https://willvelida.medium.com/understanding-indexing-in-azure-cosmos-db-62299c351a19的
- https://learn.microsoft.com/en-us/azure/cosmos-db/index-overview的
- https://devblogs.microsoft.com/cosmosdb/new-ways-to-use-composite-indexes/的
我被卡住了。有人能帮我找出这个查询的正确组合索引配置吗?
1条答案
按热度按时间bhmjp9jg1#
原因是
我很确定这种情况下不能利用索引:第一个月
从
LOWER
function documentation开始:*此函数不使用索引。
一个旁注,不必显式使用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在经济上是可行的。很少,但你算算。