Перейти к основному содержимому

SQL Digest

Эта тема знакомит с функцией SQL Digest в Selena. Эта функция поддерживается начиная с версии 1.5.0.

Обзор

SQL Digest — это отпечаток, сгенерированный историческими SQL-запросами с удаленными параметрами. Он помогает группировать SQL-запросы с одинаковой структурой, но разными параметрами.

Основные случаи использования SQL Digest включают:

  • Поиск других SQL-запросов с той же структурой, но разными параметрами в истории запросов
  • Отслеживание частоты выполнения, накопительного времени и других статистик SQL с одинаковой структурой
  • Выявление наиболее времязатратных SQL-паттернов в системе

В Selena SQL Digest в основном записываются через журналы аудита fe.audit.log. Например, выполните следующие два SQL-запроса:

SELECT count(*) FROM lineorder WHERE lo_orderdate > '19920101';
SELECT count(*) FROM lineorder WHERE lo_orderdate > '19920202';

В fe.audit.log будут сгенерированы два одинаковых Digest:

Digest=f58bb71850d112014f773717830e7f77
Digest=f58bb71850d112014f773717830e7f77

Использование

Предварительные требования

Чтобы включить эту функцию, необходимо установить параметр конфигурации FE enable_sql_digest в true.

Выполните следующий запрос для динамического включения:

ADMIN SET FRONTEND CONFIG ('enable_sql_digest'='true');

Для постоянного включения необходимо добавить enable_sql_digest = true в файл конфигурации FE fe.conf и перезапустить 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 будут нормализованы. Например, похожие SQL-запросы с WHERE a = 1 и WHERE a = 2 будут иметь одинаковый Digest.
  • Предикаты IN будут нормализованы. Например, похожие SQL-запросы с IN (1,2,3) и IN (1,2) будут иметь одинаковый Digest.
  • Конструкции LIMIT N будут нормализованы. Например, похожие SQL-запросы с LIMIT 10 и LIMIT 30 будут иметь одинаковый Digest.