SQL 摘要
本主题介绍 StarRocks 的 SQL 摘要(SQL Digest)功能。此功能从 v3.3.6 版本开始支持。
概览
SQL 摘要是通过移除参数后对历史 SQL 语句生成的指纹。它有助于将具有相同结构但参数不同的 SQL 语句聚类。
SQL 摘要的常见用例包括
- 在查询历史中查找具有相同结构但参数不同的其他 SQL 语句
- 跟踪具有相同结构的 SQL 的执行频率、累计时间和其它统计信息
- 识别系统中耗时最长的 SQL 模式
在 StarRocks 中,SQL 摘要主要通过审计日志 fe.audit.log 记录。例如,执行以下两条 SQL 语句
SELECT count(*) FROM lineorder WHERE lo_orderdate > '19920101';
SELECT count(*) FROM lineorder WHERE lo_orderdate > '19920202';
在 fe.audit.log 中将生成两个相同的摘要
Digest=f58bb71850d112014f773717830e7f77
Digest=f58bb71850d112014f773717830e7f77
使用方法
先决条件
要启用此功能,必须将 FE 配置项 enable_sql_digest 设置为 true。
执行以下语句动态启用它
ADMIN SET FRONTEND CONFIG ('enable_sql_digest'='true');
要永久启用,必须在 FE 配置文件 fe.conf 中添加 enable_sql_digest = true 并重启 FE。
启用此功能后,您可以安装 AuditLoader 插件对 SQL 语句进行统计分析。
查找相似 SQL
SELECT * FROM starrocks_audit_db__.starrocks_audit_tbl__
WHERE digest = '<Digest>'
LIMIT 1;
跟踪相似 SQL 的每日执行次数和耗时
SELECT
date_trunc('day', `timestamp`) query_date,
count(*),
sum(queryTime),
sum(scanRows),
sum(cpuCostNs),
sum(memCostBytes)
FROM starrocks_audit_db__.starrocks_audit_tbl__
WHERE digest = '<Digest>'
GROUP BY query_date
ORDER BY query_date
DESC LIMIT 30;
计算相似 SQL 的平均执行时间
SELECT avg(queryTime), min(queryTime), max(queryTime), stddev(queryTime)
FROM starrocks_audit_db__.starrocks_audit_tbl__
WHERE digest = '<Digest>';
聚合相似 SQL 以分析最耗时的模式
WITH top_sql AS (
SELECT digest, sum(queryTime)
FROM starrocks_audit_db__.starrocks_audit_tbl__
GROUP BY digest
ORDER BY sum(queryTime)
DESC LIMIT 10
)
SELECT * FROM starrocks_audit_db__.starrocks_audit_tbl__
WHERE digest IN (SELECT digest FROM top_sql);
参数规范化规则
- SQL 中的常量值将被规范化。例如,具有
WHERE a = 1和WHERE a = 2的相似 SQL 语句将具有相同的摘要。 - IN 条件将被规范化。例如,具有
IN (1,2,3)和IN (1,2)的相似 SQL 语句将具有相同的摘要。 LIMIT N子句将被规范化。例如,具有LIMIT 10和LIMIT 30的相似 SQL 语句将具有相同的摘要。