关于分区查询的一些问题。

废话不多说,直接上图
【StarRocks版本】2.1.8
【集群规模】3fe+5be
【附件】
正常使用dt=多少多少,可以从执行计划看得出,是没问题的,只会扫描一个分区:
图片

问题1:如果选用dt=(子查询)这种,就会变成全分区扫描;
图片

对于dt=(子查询)不论子查询种是否包含了预定义函数(字符串函数、时间函数等等),都会扫描全分区

问题2:对于dt=str_func(str)这种,用字符串函数对字符串进行处理时,也会扫描全分区。
图片
我自己摸索出一个方法就是,先用date_format再用cast:

所以,我最后就想问一下,关于上述两种问题,后续版本有办法进行优化吗?
我们很多表需要通过子查询去select max 去获取最大分区,这样就导致很多表无法用到分区表的特性
很多sql使用了一些字符串函数去处理时间字符串,导致也无法用到分区表的特性

2.2已经优化了,可以验证下。不过目前子查询确实不可以呢

那有没有什么比较有效的 在避免全表扫描的情况下,能获取的某一表的最大分区的办法呢? :smile_cat:

SR有RuntimeFilter,建表的时候分区列作为第一个Key就没问题了

不太懂你说的。。。能详细说一下吗

select * from table where dt in (select “XXX”);
这个时候会生成一个 RuntimeFilter
最后执行的时候相当于
select * from table where dt = “xxxxx”;
这个时候虽然分区裁剪失效了,但是如果前缀索引能命中这个条件。前缀索引会跳过很多分区数据,所以性能应该也差不多。
所以你可以改一下列顺序让他构建前缀索引的时候尽量让他命中前缀索引

@许秀不许秀 那请问下如何判断 RuntimeFilter 生效了呢?

可以看 Profile JoinRuntimeFilter 这个过滤行数

还有Scan 过滤行数

自定义函数的能下推吗

那如果是hive+SR的视图,hive层还是会扫描所有分区吧

这个还做不了分区裁剪