如何生成归一化SQL

【 TiDB 使用环境】生产环境
【 TiDB 版本】v6.5.0
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
为使用执行计划绑定,需要生成SQL 语句的归一化形式(即去除格式和参数后的形式),
目前从TiDB Dashboard–SQL语句分析中获取,这种方法有局限性,


有没有工具或者函数能生成这种归一化的SQL呢?

用 TiDB 的 parser,可以参考 TestNormalize 这个测试写

没有听说过有这样子的工具,可能是没有需求吧

能说详细点吗?不明白

https://github.com/pingcap/tidb/blob/5c2dde89a3221cacb069f1b0126891bfe7e74dcf/pkg/parser/digester_test.go#L26 参考这个函数

1 个赞

执行计划绑定不需要生成归一化 SQL

1 个赞

其实通过你上面的SQL Digest在 information_schema.statements_summaryDIGEST_TEXT字段可以拿到归一化的SQL。

参考:
https://docs.pingcap.com/zh/tidb/v6.5/statement-summary-tables#statements_summary-字段介绍

1 个赞

官网上有看下是要这个吗: 执行计划管理 (SPM) | PingCAP 文档中心

以下示例查找过去两周执行次数超过 10 次、执行计划不稳定且未被绑定的 SELECT 语句,并按照执行次数排序,将执行次数前 100 的查询绑定到对应的查询延迟最低的计划上。

WITH stmts AS (                                                -- Gets all information
  SELECT * FROM INFORMATION_SCHEMA.CLUSTER_STATEMENTS_SUMMARY
  UNION ALL
  SELECT * FROM INFORMATION_SCHEMA.CLUSTER_STATEMENTS_SUMMARY_HISTORY 
),
best_plans AS (
  SELECT plan_digest, `digest`, avg_latency, 
  CONCAT('create global binding from history using plan digest "', plan_digest, '"') as binding_stmt 
  FROM stmts t1
  WHERE avg_latency = (SELECT min(avg_latency) FROM stmts t2   -- The plan with the lowest query latency
                       WHERE t2.`digest` = t1.`digest`)
)

SELECT any_value(digest_text) as query, 
       SUM(exec_count) as exec_count, 
       plan_hint, binding_stmt
FROM stmts, best_plans
WHERE stmts.`digest` = best_plans.`digest`
  AND summary_begin_time > DATE_SUB(NOW(), interval 14 day)    -- Executed in the past 2 weeks
  AND stmt_type = 'Select'                                     -- Only consider select statements
  AND schema_name NOT IN ('INFORMATION_SCHEMA', 'mysql')       -- Not an internal query
  AND plan_in_binding = 0                                      -- No binding yet
GROUP BY stmts.`digest`
  HAVING COUNT(DISTINCT(stmts.plan_digest)) > 1                -- This query is unstable. It has more than 1 plan.
         AND SUM(exec_count) > 10                              -- High-frequency, and has been executed more than 10 times.
ORDER BY SUM(exec_count) DESC LIMIT 100;                       -- Top 100 high-frequency queries.
1 个赞

1、使用如下SQL查到SQL 的DIGEST:‘77750223e273b9668445638594f815bca555e963a810db030c61200e4b8e474b’
select * from INFORMATION_SCHEMA.CLUSTER_PROCESSLIST where info is not null order by time desc
2、 使用 如下SQL查询其归一化的SQL (DIGEST_TEXT)
select * from information_schema.statements_summary where digest = ‘77750223e273b9668445638594f815bca555e963a810db030c61200e4b8e474b’

学习了

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。