V5.0.4 SPM没有生效

【 TiDB 使用环境】V5.0.4

【概述】创建SPM,但是程序执行的SQL没有按照强制索引走

1、navicat analyze SQL 发现是按照正确索引走的,但是程序运行始终走的错误索引。

2、如何查看explain SQL是否成功按照SPM执行。

1 个赞

5.2版本前可以explain analyze, slow_query视图里有个Plan_from_binding字段


5.2版本后:

使用 explain format = 'verbose' 语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 binding
2 个赞

QQ%E6%88%AA%E5%9B%BE20211115141034

程序运行过程中,TiDB大量慢SQL,查看dashboard的慢SQL执行计划,发现走的错误索引,将该慢SQL复制出来到客户端运行正常,查询确实走了SPM。

是否有下一步定位思路?

1 个赞

是不是程序中有什么变量参数设置了? 把系统的和测试的执行计划、表结构发下大家研究下

手动执行慢SQL及执行计划 (3.2 KB) dashboard中的慢SQL及执行计划 (11.5 KB)
show global bindings (852 字节)

1、取了dashboard中的慢查询及执行计划。
2、将dashboard中的慢查询复制到navicat中执行并导出执行计划。
3、dashboard中没有走正确索引,手动执行是按照SPM索引走的。

1 个赞




我觉得程序的SQL和应用的SQL大小写、引号等字符应该和bind的original_sql 保持一致。
另外手动、程序里的estROWS差异很大看看表健康度是不是不够? order_code列的选择性不知道怎么样,如果这个索引用不到的话可以先设置invisible。

1 个赞

1、SQL我是从dashboard中点击复制格式化SQL复制出来的,并且依据此SQL再进行的SPM。
2、我手动执行SQL 也是通过dashboard中复制,然后到navicat或者mysql client中执行,手动执行都有走正确索引。
3、该无效索引在其他SQL中有作用,不能invisible。

另外我从cluster_SLOW_QUERY表中将慢SQL查出来,复制后执行,效果是走了正确索引,并且是按照SPM实现的。

1 个赞

你把dashboard里的慢SQL复制然做bind,然后从cluster_SLOW_QUERY表复制这个慢SQL执行后使用了之前用dashboard SQL 绑定的执行计划了,是这意思吧

1、我做SPM的SQL是从dashboard复制出来的。

2、我手动执行的SQL也是从dashboard复制出来的。

3、我查询了cluster_SLOW_QUERY,从中复制了SQL出来手动执行,也是可以走SPM的。

1 个赞

得让研发大佬看看了

未解决,等待中。

未解决,继续等待中。

你好,麻烦再提供下这些资料,资料下载失效了。

dashboard中的慢SQL及执行计划 (11.5 KB) 手动执行慢SQL及执行计划 (3.2 KB) show global bindings (852 字节)

1 个赞

麻烦通过select version()查看一下TiDB的具体版本。

1 个赞

V5.0.4 首贴打错了,标题是对的。

1 个赞

1、这边是否有设置sql_select_limit 参数呢?
2、确认下运行 query 和 binding 的字符集是不是一致?

1、sql_select_limit 值
QQ%E6%88%AA%E5%9B%BE20211123132718

2、如何查看程序query和手动binding的字符集?

1 个赞

在执行binding的session里面查看字符集。
查看程序的连接字符串是否有设置字符集。