Перейти к основному содержимому
Версия: 2.0.x

SQL Digest

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

Обзор

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 selena_audit_db__.selena_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 selena_audit_db__.selena_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 selena_audit_db__.selena_audit_tbl__
WHERE digest = '<Digest>';

Агрегация похожих SQL для анализа наиболее времязатратных шаблонов

WITH top_sql AS (
SELECT digest, sum(queryTime)
FROM selena_audit_db__.selena_audit_tbl__
GROUP BY digest
ORDER BY sum(queryTime)
DESC LIMIT 10
)
SELECT * FROM selena_audit_db__.selena_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.