算子没有下推到TiFlash

【 TiDB 使用环境】测试 7.6.0
【 TiDB 版本】v7.6.0
【复现路径】在数据库中执行以下命令,进行算子下推测试(根据tiflash官方教程)

CREATE TABLE t(id INT PRIMARY KEY, a INT);
ALTER TABLE t SET TIFLASH REPLICA 1;
INSERT INTO t(id,a) VALUES (1,2),(2,4),(11,2),(12,4),(13,4),(14,7);
EXPLAIN SELECT MAX(id + a) FROM t GROUP BY a;

得到如下分析结果

【遇到的问题:问题现象及影响】
算子没有按教程展示的那样下推到tiflash

执行SELECT * FROM information_schema.tiflash_replica WHERE TABLE_NAME='t';

确认tiflash已经可用

同时,检查engine隔离配置。已经启用tiflash

我查看tiflash的错误日志,有发现以下,不知道有没有关系

[2024/07/11 17:01:24.896 +08:00] [WARN] [StorageConfigParser.cpp:287] ["The configuration `path` is deprecated. Check [storage] section for new style."] [thread_id=1]
[2024/07/11 21:58:55.595 +08:00] [ERROR] [LocalAdmissionController.cpp:445] ["watch resource group event failed: read watch stream failed, CANCELLED"] [source=LocalAdmissionController] [thread_id=295]
[2024/07/11 21:58:58.606 +08:00] [WARN] [StorageConfigParser.cpp:287] ["The configuration `path` is deprecated. Check [storage] section for new style."] [thread_id=1]
[2024/07/11 22:03:18.236 +08:00] [WARN] [ReadIndex.cpp:224] ["1 regions CANNOT fetch latest commit-index from TiKV, (region-id): 60200"] [source=WaitCheckRegionReady] [thread_id=1]

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面

6.5.10测试可以的

无法复现

也是很纳闷,参数也都配置对了吧?

感觉应该是升级过程中tiflash有问题,导致不能提供服务。所以不能下推。
display看看tiflash的版本升级上来了么?将表的tiflash副本改成0,再改成1试试能不能重建副本成功。

https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_allow_mpp-从-v50-版本开始引入

是不是tidb_allow_mpp被设置成了off?

期待官方的解决方案。

先使用hint,看看到底能不能在tifalsh表中获取到数据 READ_FROM_STORAGE
https://docs.pingcap.com/zh/tidb/stable/optimizer-hints#read_from_storagetiflasht1_name--tl_name--tikvt2_name--tl_name-

我看了下,是on

explain analyze SELECT /*+ READ_FROM_STORAGE(TIFLASH[t]) */ t.id FROM t;
执行上面语句强制指定存储引擎,会使用tiflash

副本肯定是有了,因为指定tiflash引擎,能查出来
SELECT /*+ READ_FROM_STORAGE(TIFLASH[t]) */ t.id FROM t;

我不知道为何tidb没有选择tiflash下推max算子,按教程应该是要下推
EXPLAIN SELECT MAX(id + a) FROM t GROUP BY a;

https://docs.pingcap.com/zh/tidb/stable/use-tiflash-mpp-mode#控制是否选择-mpp-模式

set @@session.tidb_allow_mpp=1;
set @@session.tidb_enforce_mpp=1;

把这两个设置打开。

如果由于代价估算之外的原因导致 TiDB 优化器无法选择 MPP,在你使用 EXPLAIN 语句查看执行计划时,会返回警告说明原因

可以排查一下。

set @@session.tidb_allow_mpp=1;
set @@session.tidb_enforce_mpp=1;

执行之后,我再执行EXPLAIN SELECT MAX(id + a) FROM t GROUP BY a; 没有警告信息,
结果如下:


变成全部都下推到tiflash了,似乎不合理?
我执行EXPLAIN select * from t where id != 1,正常应该下推到tikv吧?它也下推到tiflash了,如下:

不过奇怪的是,tidb_enforce_mpp过一小段时间就会被重新恢复成0,然后又全都下推给tikv了,这是什么原因呢?

tidb_enforce_mpp这个设置为on。就是无论如何都会走tiflash。这是正常现象。

现在看下来不走tiflash就是优化器没有选择走tiflash,并不是因为某些原因不能走tiflash。

这个需要绑定执行计划,或者加一些hint,让sql稳定的走tiflash就可以了。

1 个赞

对的,看楼主上面的描述,并不是不能走TiFlash,而是没有选择走TiFlash,可能是优化器评估走TiKV代价更低,所以没有选择走TiFlash。这个可以通过EXPLAIN FORMAT = “verbose” ,对比下走TiFlash和走TiKV的代价哪个更低。

EXPLAIN FORMAT = "verbose"  你的SQL

EXPLAIN 语句将以 row 格式输出结果,并在结果中额外包含一个 estCost 列,表示查询的代价估算。
参考:
https://docs.pingcap.com/zh/tidb/stable/sql-statement-explain#explain

优化器的原因吧?

看看数据库优化器是否生效