在 GaussDB 中,归一化 SQL(Normalized SQL)是指将接收到的每个 SQL 语句进行解析和处理,生成一个唯一的标识符(Unique SQL ID),用于标识一类相似的 SQL 语句。归一化 SQL 的主要目的是为了更高效地统计和分析 SQL 语句的执行情况,从而为性能调优和维护提供依据
归一化 SQL 的定义
归一化 SQL 是通过对 SQL 语句的文本字符串进行解析,生成内部解析树,然后遍历解析树并忽略其中的常数值,以一定的算法计算出来一个整数值作为 Unique SQL ID。这个 ID 用来唯一标识一类 SQL 语句。例如,以下两条 SQL 语句:
select * from t1 where id = 1;
select * from t1 where id = 2;这两条 SQL 语句的统计信息会汇聚到同一个 Unique SQL 上:
select * from t1 where id = ?;归一化 SQL 的功能
归一化 SQL 的主要功能包括:
统计执行信息:归一化 SQL 可以统计 SQL 语句的执行次数、响应时间、Cache/IO 信息、行活动等。这些信息可以帮助数据库管理员了解 SQL 语句的执行性能
。 性能调优:通过归一化 SQL,可以定位消耗不同资源的 Top SQL,为集群性能调优和维护提供依据
。 查询过滤:归一化 SQL 的特征值(如
unique_sql_id和sql_hash)可以用于查询过滤,帮助快速定位和分析特定的 SQL 语句。
归一化 SQL 的视图
GaussDB 提供了 GS_INSTR_UNIQUE_SQL 视图,用于显示当前节点收集的 Unique SQL 的执行信息。该视图包括以下内容:
Unique SQL ID:归一化的 Unique SQL ID。
归一化后的 SQL 文本:归一化后的 SQL 语句文本。
执行次数:成功执行的次数。
响应时间:数据库内部的 SQL 执行时间,包括最小、最大和总时间。
Cache/IO 信息:包含块的物理读、逻辑读次数。
行活动:包含 SELECT 语句的结果集返回行数、更新行、插入行、删除行等信息
。
使用归一化 SQL 的注意事项
统计信息的约束:只有执行成功的 SQL 才会显示其详细的统计信息,否则可能只记录查询、节点、用户等信息
。 事务块的支持:对于类似
BEGIN;...;COMMIT;等形式的事务块,当前不支持统计子句的解析时间(parse_time)。 Unique SQL 的超时时间:可以通过 GUC 参数设置 Unique SQL 的超时时间,后台线程会定期检查并删除过期的 Unique SQL
。
通过使用归一化 SQL,GaussDB 能够更高效地管理和分析 SQL 语句的执行情况,从而提升数据库的性能和稳定性。




