用jdbctemplate两表联立求行数报错

为了更快的定位您的问题,请提供以下信息,谢谢
【详述】问题详细描述
在spring boot中,用jdbctemplate两表联查,求行数报异常,sql如下:
select count() from
select a.a1,a.a2,b.b1,b.b2
from a left join b on a.exp1 = b.exp1) as t
在jdbctemplate下执行如下sql,就没有问题(在子查询里加了where条件):
select count(
) from
select a.a1,a.a2,b.b1,b.b2,a.exp1
from a left join b on a.exp1 = b.exp1 where a.exp1=‘3’) as t

报错提示内容是:
nested exception is java.sql.SQLSyntaxErrorException: only found column statistics: {343: exp1}, but missing statistic of col: 253: exp1.
报异常的内容如下:
at com.starrocks.sql.optimizer.statistics.Statistics.getColumnStatistic(Statistics.java:83) ~[starrocks-fe.jar:?]
at com.starrocks.sql.optimizer.statistics.StatisticsCalculator.lambda$computeJoinNode$3(StatisticsCalculator.java:788) ~[starrocks-fe.jar:?]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?]
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[?:?]
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602) ~[?:?]
at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:280) ~[?:?]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?]
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602) ~[?:?]
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) ~[?:?]
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) ~[?:?]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) ~[?:?]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?]
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) ~[?:?]
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) ~[?:?]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
at java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:632) ~[?:?]
at com.starrocks.sql.optimizer.statistics.StatisticsCalculator.computeJoinNode(StatisticsCalculator.java:789) ~[starrocks-fe.jar:?]
at com.starrocks.sql.optimizer.statistics.StatisticsCalculator.visitLogicalJoin(StatisticsCalculator.java:746) ~[starrocks-fe.jar:?]
at com.starrocks.sql.optimizer.statistics.StatisticsCalculator.visitLogicalJoin(StatisticsCalculator.java:167) ~[starrocks-fe.jar:?]
at com.starrocks.sql.optimizer.operator.logical.LogicalJoinOperator.accept(LogicalJoinOperator.java:200) ~[starrocks-fe.jar:?]
at com.starrocks.sql.optimizer.statistics.Statistic

这两个表重新建,再执行相同sql,是没有问题的。
【背景】做过哪些操作?
数据库系统从3.2.2升级到了3.2.4,表是升级后建的。
数据库里有关于这两个表的异步物化视图(怀疑是异步物化视图导致的这个问题)
【业务影响】
统计查询报错
【是否存算分离】

【StarRocks版本】例如:3.2.4
【集群规模】例如:3fe(1 follower+2observer)+5be(fe与be混部)
1fe+ 3be
【机器信息】CPU虚拟核/内存/网卡,例如:48C/64G/万兆
虚拟机 Intel® Xeon® CPU E5-2620 v3 @ 2.40GHz/16G/

【联系方式】为了在解决问题过程中能及时联系到您获取一些日志信息,请补充下您的联系方式,例如:社区群4-小李或者邮箱,谢谢
社区群18-Mathematics

【附件】

  • fe.log/beINFO/相应截图
  • 慢查询:
    • Profile信息
    • 并行度:show variables like ‘%parallel_fragment_exec_instance_num%’;
    • pipeline是否开启:show variables like ‘%pipeline%’;
      pipline
    • be节点cpu和内存使用率截图
  • 查询报错:
  • be crash
    • be.out
  • 外表查询报错
    • be.out和fe.warn.log

发一下这个查询报错的表的 querydump 文件

wget --user=root --password=1234 --post-file post_file http://fe_host:fe_http_port/api/query_dump?db=tpch -O dump_file

user 和 password 是执行sql 的用户名以及密码,
post_file为包含查询sql的文件,把sql放到这个文件中
db 为该sql查询的db
dump_file是返回的数据(最后需要发dump_file文件 )

老师,这个dump文件不提供的话,能大概定位这个问题吗?不太方便提供dump文件。我怀疑是建视图导致的。因为中间没做过什么操作,我们需要建很多视图,建完之后报错了。

老师,我今天在测这个问题,我用idea的远程调试,打断点的时候,这个问题就不复现,不知道这里是不是有多线程的处理。

querydump里面可以混淆column信息,应该没啥敏感的东西

这个我们不让提供出来,我调试代码的时候,发现on后面的其中一个字段是{}这种,里面没有数据,可能就是这里的问题。

dump_file1 (29.2 KB)
这个问题复现了,麻烦看一下。谢谢!

dump_file1 (29.2 KB)
这个问题复现了,麻烦看一下,谢谢!

复现这个问题,是通过刷新异步物化视图复现的。通过刷新异步物化视图REFRESH MATERIALIZED VIEW v_fb00145b WITH SYNC MODE;
,问题就复现了。

可以先临时关了mv 改写,我找个大佬看下

set enable_materialized_view_rewrite=false; 这个是吧?我关了,之后就好了。
还有这个问题https://forum.mirrorship.cn/t/topic/12501,麻烦找大佬一起看下吧。我关了mv之后也好了。13348能调试。12501的问题是直接没响应了,我远程调试都不知道在哪卡住了。
13348把断点直接打到报异常的地方,程序就能走到异常,打到异常的上一步,就不走异常了,感觉应该是和多线程有关。


字段赋值的时候应该赋两个值,程序只赋了一个。应该是丢了一个。我程序调试了一半没有找到这个赋值的最原始的地方。
方便的话麻烦回复我一下怎么解决的,我学习一下。十分感谢!