有趣的SQL DIGEST
* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
SQL DIGEST是什么
DIGEST TEXT
SQL DIGEST
SQL DIGEST有什么作用
代码中与SQL DIGEST相关的处理函数
常见问题
SQL DIGEST是什么
DIGEST TEXT
DIGEST TEXT
本质是一种SQL语句规范化后将常量替换成'?'的运算结果,STATEMENT_DIGEST_TEXT
函数用于计算语句的DIGEST TEXT
(摘要文本)
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摘要)
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
的函数:
/*
参考: 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
的函数:
/*参考: 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 :)
《深入浅出MGR》视频课程
戳此小程序即可直达B站
https://www.bilibili.com/medialist/play/1363850082?business=space_collection&business_id=343928&desc=0
文章推荐:
想看更多技术好文,点个“在看”吧!