前缀索引某场景下过滤失效

Viewed 87

版本:v2.1.5

有一张unique模型的表,使用sessionId作为unique key

查询模型:
select count(*) from table where sessionId in ('xxx','xxx'...)

问题:
当sessionId in的list中元素个数<=48个时,查询性能极高
而元素个数>48个时,前缀索引失效,表全扫

以下是当元素为48个和49个的profile对比
48个:image.png

49个:image.png

经验证,max_scan_key_num默认值为48,session变量 set max_scan_key_num = 49之后,即可恢复正常的性能;
但不能因为无法并行处理所有key range 就直接全扫,这个逻辑不合理

3 Answers

你可以先 set global max_scan_key_num=100(或者其他适应你的使用场景的值)临时解决你的问题。

当 scan key 数量超限的时候,目前 doris 会把多个 fixed key 合并成一个大的 key range 用来进行前缀索引过滤,同时保留之前的 scan key 用于进一步计算层的过滤。

目前来看 max_scan_key_num 默认值 48 可能不太合理,还有就是我们后续可能会优化这里的合并逻辑,选择合并成多个 key range 去做过滤。

问题状态:跟进中,有进展会更新回帖

先用倒排索引来解决吧