V5.0.4 SPM没有生效

程序是用的utf8

接下来还需要排查什么?

1、麻烦提供下schema 和binding的原始语句
2、确认下dashboard中 default_db是什么?

1 个赞

1、show global bindings、原始慢SQL我在前面都上传附件了。

2、dashboard中的慢SQLschema 与show global bindings 中的default_db是一致的。

3、我在shell中执行了从dashboard中复制的慢SQL,然后再 select @@tidb_use_plan_baselines; 显示为1。

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

1 个赞

麻烦提供下可以复现的具体步骤和SQL,包括表结构,执行的binding 语句等。我们这边看是否能复现。

1、过程:程序查询TiDB产生大量慢查询,根据dashboard提供的慢查询,采用SPM binding正确索引,手动执行SQL正常。

2、show global bindings show global bindings (852 字节) 如下:

3、表结构如下:
create table (649 字节)

1 个赞

从下面的图片可以看出,dashboard 上面显示的计划,SQL 原文中没有 Limit 语句,而执行计划中有一个 Limit 1;


再对比下你这边手动执行的,就没有 Limit 出现:

麻烦确认下,线上程序的 session 是否设置了 SQL_select_limit 这个配置;

1 个赞

1、目前与开发确认程序侧是没有limit设置的。

2、从dashboard以及information.slow_query表中取到的原始SQL来看,语句中没有limit,执行计划中确实有。

1、可以查看下代码或者框架里面是否有sql_select_limit关键字
2、可以让开发那边测试下直接返回show variables like 'sql_select_limit’的值是多少。

如果框架带了limit,为何dashboard和information.slow_query表中捕获的慢查询语句没有带limit呢?

1 个赞

这是因为如果是设置的session变量,或者是框架设置的参数,这个是不会算在SQL语句里面,dashboard里面没有记录也是可能的。

如果我换个方式做SPM,即在原始SQL和绑定SQL后都加上 limit ‘?’
再运行业务,观察慢查询,是否是一种手段?

我测试使用原始SQL后加 limit 1 进行 explain analyze 确实很慢,应该是没走SPM了。

你尝试使用SPM加limit 了吗?

1 个赞

应用程序这个参数是怎么加上去的

加了,发现一个问题,不可以 limit ‘?’ , 但是可以 limit 1, 目前观察 即使SPM limit 1, 我手动执行SQL limit 123 或者limit 任意,都可以按照SPM去走。

@h5n1暂时没查出程序侧limit是哪里来的

1、show global binding, 模板绑定的是 limit 1
QQ%E6%88%AA%E5%9B%BE20211125201032

2、执行查询 limit 123,发现是按照SPM走的
QQ%E6%88%AA%E5%9B%BE20211125200903
QQ%E6%88%AA%E5%9B%BE20211125200912

1 个赞

今晚程序跑的还是有不按照SPM运行的现象。

└─Limit_15 root 1 offset:0, count:1

我SPM中就是写死limit 1,难道这个隐藏的语法有 limit 0,1 这种写法?

你们采用什么开发语言、开发框架、驱动的呢?

可以按照这个来测试下

select * from test . t limit ...

没明白这个‘limit … ’是什么意思


参考:https://docs.pingcap.com/zh/tidb/stable/sql-plan-management

1 个赞