有趣的SQL DIGEST

2023-02-23 10:38:29 浏览数 (1)

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

  • SQL DIGEST是什么
    • DIGEST TEXT
    • SQL DIGEST
  • SQL DIGEST有什么作用
  • 代码中与SQL DIGEST相关的处理函数
  • 常见问题

SQL DIGEST是什么

DIGEST TEXT

DIGEST TEXT本质是一种SQL语句规范化后将常量替换成'?'的运算结果,STATEMENT_DIGEST_TEXT函数用于计算语句的DIGEST TEXT(摘要文本)

代码语言:javascript复制
mysql> SELECT STATEMENT_DIGEST_TEXT('SELECT * FroM T1 WHERE c1 > 10 and c2="abc" AND 1 SIN(3) > 0;') AS label;
 ------------------------------------------------------------------------ 
| label                                                                  |
 ------------------------------------------------------------------------ 
| SELECT * FROM `T1` WHERE `c1` > ? AND `c2` = ? AND ?   `SIN` (?) > ? ; |
 ------------------------------------------------------------------------ 
1 row in set (0.00 sec)

注意:

  • 关键字都被大写
  • 标识符都被加反引号
  • 常量包括数值常量和字符串常量都被替换成'?'

SQL DIGEST

SQL DIGEST本质是将SQL语句规范化后将常量替换成'?'的字符串进行哈希运算得到的结果,STATEMENT_DIGEST函数用于计算语句的SQL DIGEST(SQL摘要)

代码语言:javascript复制
mysql> SELECT STATEMENT_DIGEST('SELECT * FROM T1 WHERE c1 > 2;') AS label;
 ------------------------------------------------------------------ 
| label                                                            |
 ------------------------------------------------------------------ 
| 3e2db85c14a4bc5662e406bedb24bc3b47bc98ee99f28bba846e32980a09448d |
 ------------------------------------------------------------------ 
1 row in set (0.00 sec)

mysql> SELECT STATEMENT_DIGEST('SelecT   * FROM T1 WHERE c1 > 2;') AS label;
 ------------------------------------------------------------------ 
| label                                                            |
 ------------------------------------------------------------------ 
| 3e2db85c14a4bc5662e406bedb24bc3b47bc98ee99f28bba846e32980a09448d |
 ------------------------------------------------------------------ 
1 row in set (0.00 sec)

注意:

  • 关键字的大小写和空格不影响摘要值的计算
  • 常量值的变化不影响摘要值的计算

SQL DIGEST有什么作用

在性能或工作负载分析中,需要对当前或区间运行语句进行统计分析,如果直接使用SQL会导致分析失焦,如果使用SQL DIGEST进行分析,通常分析目标会下降2-3个数量级,运行最复杂的生产系统,一般就是在万这个级别,通常在几千到几万。使用SQL DIGEST分析的好处包括:

  • 作为SQL语句的指纹基本携带了SQL语句中相对重要的信息
  • 分析目标显著减少
  • SQL DIGEST值相对稳定,可以在关联分析时,用做JOIN的条件

代码中与SQL DIGEST相关的处理函数

计算STATEMENT_DIGEST_TEXT的函数:

代码语言:javascript复制
/*
参考: sql_digest.cc
Iterate token array and updates digest_text.
*/
void compute_digest_text(const sql_digest_storage *digest_storage, String *digest_text)

计算STATEMENT_DIGEST的函数:

代码语言:javascript复制
/*参考: sql_digest.cc*/
void compute_digest_hash(const sql_digest_storage *digest_storage, unsigned char *hash)

常见问题

问题1:语句末尾的';'是否影响语句DIGEST的计算?

回答:是。


问题2:不同数据库的相同SQL的SQL DIGEST是否相同?

回答:否。


问题3:SQL DIGEST是否基于DIGEST TEXT计算?

回答:否,SQL DIGEST基于解析树生成的特殊表示计算,包括:将TOKEN替换成数值,将标识符替换成长度和字符串等。


问题4:对表或表的视图进行查询是否生成不一样的SQL DIGEST?

回答:是。

Enjoy GreatSQL :)


《零基础学习MySQL》视频课程

戳此小程序即可直达B站

https://www.bilibili.com/video/BV1Da411W7Va?spm_id_from=333.999.0.0&vd_source=ae1951b64ea7b9e6ba11f1d0bbcff0e4


文章推荐:

  • 包拯断案 | 别再让慢sql背锅@还故障一个真相
  • 浅析TIMESTAMP类型
  • 老司机开车@如何拯救沦陷的MySQL内存少女
  • 13. 分布式恢复 | 深入浅出MGR
  • 12. 新节点加入MGR集群过程解读 | 深入浅出MGR

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee: https://gitee.com/GreatSQL/GreatSQL

GitHub: https://github.com/GreatSQL/GreatSQL

Bilibili:

https://space.bilibili.com/1363850082/video

0 人点赞