突破边界
2024 年7 月 11 日 09:43
1
【 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) 截图此页面
Kongdom
(Kongdom)
2024 年7 月 12 日 01:07
5
感觉应该是升级过程中tiflash有问题,导致不能提供服务。所以不能下推。
display看看tiflash的版本升级上来了么?将表的tiflash副本改成0,再改成1试试能不能重建副本成功。
有猫万事足
2024 年7 月 12 日 02:47
6
Ming
2024 年7 月 12 日 04:00
8
突破边界
2024 年7 月 12 日 05:20
10
explain analyze SELECT /*+ READ_FROM_STORAGE(TIFLASH[t]) */ t.id FROM t;
执行上面语句强制指定存储引擎,会使用tiflash
突破边界
2024 年7 月 12 日 05:27
11
副本肯定是有了,因为指定tiflash引擎,能查出来
SELECT /*+ READ_FROM_STORAGE(TIFLASH[t]) */ t.id FROM t;
我不知道为何tidb没有选择tiflash下推max算子,按教程应该是要下推
EXPLAIN SELECT MAX(id + a) FROM t GROUP BY a;
有猫万事足
2024 年7 月 12 日 06:07
12
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
语句查看执行计划时,会返回警告说明原因
可以排查一下。
突破边界
2024 年7 月 12 日 16:47
13
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了,这是什么原因呢?
有猫万事足
2024 年7 月 14 日 13:08
14
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