SQL Digest
このトピックでは、StarRocks の SQL Digest 機能について紹介します。この機能は v3.3.6 以降でサポートされています。
概要
SQL Digest は、パラメータを除去した履歴 SQL ステートメントから生成されるフィンガープリントです。これにより、同じ構造を持つが異なるパラメータを持つ SQL ステートメントをクラスタリングすることができます。
SQL Digest の一般的な使用例には以下があります:
- クエリ履歴で同じ構造だが異なるパラメータを持つ他の SQL ステートメントを見つける
- 同じ構造を持つ SQL の実行頻度、累積時間、その他の統計を追跡する
- システム内で最も時間のかかる SQL パターンを特定する
StarRocks では、SQL Digest は主に監査ログ fe.audit.log を通じて記録されます。例えば、次の 2 つの SQL ステートメントを実行します:
SELECT count(*) FROM lineorder WHERE lo_orderdate > '19920101';
SELECT count(*) FROM lineorder WHERE lo_orderdate > '19920202';
fe.audit.log には同じ Digest が 2 つ生成されます:
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 ステートメントは同じ Digest を持ちます。 - IN 述語は正規化されます。例えば、
IN (1,2,3)
とIN (1,2)
を含む類似の SQL ステートメントは同じ Digest を持ちます。 LIMIT N
句は正規化されます。例えば、LIMIT 10
とLIMIT 30
を含む類似の SQL ステートメントは同じ Digest を持ちます。