单表百亿数据查询优化

【详述】问题详细描述
单表查询想要达到秒级返回
【背景】做过哪些操作?
添加过索引,创建了物化视图
【业务影响】
【StarRocks版本】例如:2.4.1
【集群规模】例如:3fe(1 follower+2observer)+18be
【机器信息】CPU虚拟核/内存/网卡,例如:


【附件】

  • Profile信息
  • 并行度:show variables like ‘%parallel_fragment_exec_instance_num%’;
    10
  • pipeline是否开启:show variables like ‘%pipeline%’;
    image
  • 执行计划:explain costs + sql
    plan.txt (20.4 KB)
  • be节点cpu和内存使用率截图

建表语句:
建表语句.txt (12.7 KB)

数据量:3893973473

query_profile.txt (45.3 KB)

可以把pipeline_dop设置为10然后再跑下看下

有部分查询变快了点,但是超过1s的查询变化不大

可以执行下show partitions from table_name;然后把结果发下么?看起来是有一些数据倾斜

S_ORDER_ITEM_DETAIL 2195416 1 2022-09-21 16:30:42 0 NORMAL ROW_ID 120 3 HDD 9999-12-31 23:59:59 0B false 0

好像发少了,这个表我看有特别多的分区。方便重发一份更全面的么?

不好意思,刚刚给错了。partition.txt (22.4 KB)

有一个问题请教一下,就是我虽然有分区,但是我的查询里面都没有使用到分区,这种情况下,我是不要分区,直接增加桶数好一点,还是要分区,增加分区的桶数好一点呢?

嗯嗯,show partitions里面可以看到一个data_size列,可以评估下具体设置多少个bucket,一般推荐在100m-1g之间

如果是TB级别的我按100m建桶的话,会不会桶太多了,台碎片话了呢?

嗯嗯,确实会有这个问题。这个时候可以按照1G-10G的规模来走。

那么表的桶的数量上限有一个建议吗?

这个是没有的,不过不建议bucket太多。太多的话会引起的导入性能会有所下降。这个要做一下取舍。

我们表就只是历史数据,不需要做导入了。主要想查询性能提高到0.5s,甚至是0.1s内返回。还有什么可以调整的建议吗?

这个需要case by case的来做优化,我们可以先将bucket这个问题给处理掉。

这个查询在 scan 层 花费了大约4s的时间,我理解

  1. 调整 bucket
  2. 添加bitmap index可以先试下。

这种大基数的也是使用bitmap索引吗?布隆索引和bitmap索引可以同时添加吗?

select count(*) FROM SIEBEL_HISTORY.S_ORDER_ITEM_DETAIL A
WHERE A.PROD_ROW_ID IS NOT NULL AND A.PAR_ORDER_ITEM_ID IS NOT NULL
AND A.PAR_ORDER_ITEM_ID = ‘1-4DUFDJM’ 可以执行下看下这个结果么?

image

嗯嗯,我理解这个查询过滤了很多的数据。
好像countd也没有什么意义。