SQL查询结果不一致,会少数据

表数据情况:

  • dw_ext.t_1692603597355 30w行
  • dimension0 315538955行
  • group0 49006行
  • dimension1 183637610行
  • group1 49006

执行过程:
set session tidb_isolation_read_engines=‘tiflash’;
set @@session.tidb_enforce_mpp=1;
set @@tidb_opt_agg_push_down = ON;
set @@tidb_opt_distinct_agg_push_down = 1;
set @@tidb_broadcast_join_threshold_size = 10000000;
set @@tidb_broadcast_join_threshold_count = 100000;
set session tidb_max_tiflash_threads = 20;
反复执行SQL,得出不同的结果

后来我进行优化,可以得出一致的结果:

  • set session tidb_isolation_read_engines=‘TiFlash,tikv,tidb’;让集群自动选择引擎,结果正常
  • 通过with 公共表表达式进行改写,3个left join改写成两个,然后union ,结果正常
  • 去除这个SQL中不必要子查询以及null值判断,结果正常

贴一下详细的执行计划对比吧?可以在 mysql client 中使用 pager cat > example.log 来把输出结果重定向到 example.log 中,这样就可以把 plan 贴上来了。另外如果方便的话把该 sql 中相关的表结构也贴一下吧?这样能方便我们调查问题。

我碰到过就是大批量写入(5w),但只写入了四万九千九百多,每次会少了几条到十几条,是在生产环境,,现在还没解决

你是用什么方式写入的,SQL还是其他,这个问题我没有遇到过

SQL,多表关联查询,数据有几十万,五万一批写入,但写进去会少几条到十几条

贴一下这个

那你把insert先拿掉,看看select结果是不是不同。我的SQL不同是强制走了tiflash查询。

检查 TiFlash 数据分布和同步:确保 TiFlash 中的数据分布和同步与 TiDB 保持一致,以避免数据不一致的情况发生。

去掉后就是有5w条数据,insert后就少了几条,就是奇怪得很

贴一下详细的执行计划对比吧?可以在 mysql client 中使用 pager cat > example.log 来把输出结果重定向到 example.logg 中,这样就可以把 plan 贴上来了。另外如果方便的话把该 sql 中相关的表结构也贴一下吧?这样能方便我们调查问题。

:yum:建议开新帖提问,会得到更多的帮助。跟帖可能没有那么多人关注。

1 个赞

具体情况可以还原吗?开个ASK看看具体啥情况?

引擎对一些特殊值处理的方式不同把???

解决了吗?让我们也学习下