子查询 limit 导致性能差距

【StarRocks版本】例如:1.19.5
【集群规模】例如:3fe+5be
【详述】:
SQL查询时在子查询中添加limit与不添加limit性能差距很大,这个子查询只有100+条数据 ,子查询中不加limit 200 查询5min后超时,查看监控集群内存占用量很大,添加limit 200后 1min执行出结果 集群资源占用也很少,查看explain 两种执行计划相差也很大,不知道是哪里block住了:
资源占用差距如图


SQL以及Explain:
sr.sql (113.0 KB)

从当前的执行计划来看,差异主要在于 join prod.blocks ,加上limit后使用了partitioned join,未加上limit采用了broadcast join算法,导致执行性能差异巨大。

至于为何会对大表join采用broadcast join算法,单纯从执行计划无法看出,需要进一步的统计信息。

麻烦进一步提供一下 explain cost 的结果,以及详细的profile信息,参考: https://docs.starrocks.com/zh-cn/main/administration/Query_planning#profile分析

explain cost 好像没有找到这个命令,慢查询由于一直卡住直到半小时timeout所以没有profile。

今天重新遇到这个问题了 与上次的情况类似,不过SQL简单,也是子查询join的时候添加limit 性能有极大提升,不加limit无法执行出结果 ,timeout设置半小时也无法执行出结果,应该是个bug
sql 以及explain 如下:

看起来还是 join的策略不同导致,
快查询 的 join 策略为:INNER JOIN (BROADCAST)
慢查询 的 join 策略为:INNER JOIN (BUCKET_SHUFFLE)
但是join的两个表 数据只有千条左右

1赞