クエリハッシュの使用による、クエリ内のパターンと傾向の識別¶
クエリ履歴にある類似クエリを識別、グループ化、分析するには、クエリテキストのハッシュを使用できます。たとえば、次が可能です。
クエリハッシュによってクエリをグループ化し、コストのかさむクエリのパターンを識別します。
パフォーマンス改善(例: クラスタリングキーの変更)が、繰り返されるクエリに及ぼす影響を判断します。
次のビューとテーブル関数では、 query_hash
列と query_parameterized_hash
列を使用してクエリテキストのハッシュを取得できます。
ACCOUNT_USAGE ビュー(1年間保持)
INFORMATION_SCHEMA テーブル関数(7日間保持)
QUERY_HISTORY テーブル関数
TASK_HISTORY テーブル関数
このハッシュを使用して、繰り返されるクエリを分析することができます。
クエリのハッシュの使用(query_hash
)¶
query_hash
列には、 SQL ステートメントの正規化されたテキストに基づいて計算されたハッシュ値が格納されています。まったく同じクエリテキストを持つ繰り返されるクエリには、同じ query_hash
値があります。
繰り返されるクエリは、クエリテキストが以下のみで異なる場合でも、同じ query_hash
になります。
大文字と小文字を区別しない識別子、セッション変数、ステージ名
バインド変数で IDENTIFIER()を使用して指定された識別子は含まれないことに注意してください。異なる値を持つバインド変数は、異なるクエリハッシュを生成します。
空白
コメント
2つのクエリのクエリテキストでこれら以外の部分が異なる場合、それらのクエリは異なる query_hash
値を持ちます。
たとえば、以下のクエリはまったく同じクエリテキストを持つため、同じ query_hash
値を持ちます。
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'TIM'
query_hash
値を使用すると、他の方法では明確にならないクエリパフォーマンスのパターンを見つけることができます。たとえば、クエリは1回の実行では過剰にコストがかからないかもしれませんが、頻繁に繰り返されるクエリでは、実行回数に応じてコストが上昇する可能性があります。 query_hash
値を使用すると、最初に最適化に注力するクエリを特定できます。
たとえば、以下のクエリは、 query_hash
値を使用して、上位100個の長く実行されるクエリのクエリ IDs を識別子としています。
SELECT
query_hash,
COUNT(*),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE warehouse_name = 'MY_WAREHOUSE'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 7
GROUP BY query_hash
ORDER BY SUM(total_elapsed_time) DESC
LIMIT 100;
パラメーター化されたクエリのハッシュの使用(query_parameterized_hash
)¶
query_parameterized_hash
には、パラメーター化されたクエリに基づいて計算されたハッシュ値が含まれます。これは、リテラルがパラメーター化された後のクエリのバージョンを意味します。これらのリテラルは、クエリ述語の中で使用する必要があり、以下の 比較演算子 のうちの1つと合わせて使用する必要があります。
=
(等しい)!=
(等しくない)>=
(より大か等しい)<=
(より小か等しい)
繰り返されるクエリ(異なるパラメーター値の場合を含む)は、同じ query_parameterized_hash
値を持ちます。
繰り返されるクエリは、クエリテキストが以下のみで異なる場合でも、同じ query_parameterized_hash
になります。
大文字と小文字を区別しない識別子、セッション変数、ステージ名
バインド変数で IDENTIFIER()を使用して指定された識別子は含まれないことに注意してください。異なる値を持つバインド変数は、異なるクエリハッシュを生成します。
空白
コメント
同じ query_hash
値を持つクエリは、同じ query_parameterized_hash
値を持ちますが、その逆はありません。
たとえば、以下のクエリは、リテラル値がクエリ間の唯一の違いであるため、同じ query_parameterized_hash
値になります。
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'AIHUA'
query_hash
値の場合と同様に、 query_parameterized_hash
値を使用すると、他の方法では明確にならないクエリパフォーマンスのパターンを見つけることができます。
以下のステートメントは、特定の query_parameterized_hash
値(cbd58379a88c37ed6cc0ecfebb053b03
)を持つすべてのクエリについて、毎日の平均 total_elapsed_time
を計算します。
SELECT
DATE_TRUNC('day', start_time),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE query_parameterized_hash = 'cbd58379a88c37ed6cc0ecfebb053b03'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 30
GROUP BY DATE_TRUNC('day', start_time);
ハッシュ生成に使用されたバージョンの確認¶
時間の経過とともに、クエリハッシュを生成するためにSnowflakeが使用するロジックが変更される可能性があります。このロジックを変更すると、同じクエリに対して異なるハッシュが生成される可能性があります。たとえば、あるクエリに対して、ロジックのバージョン1が生成したハッシュと、ロジックのバージョン2が生成したハッシュでは異なる可能性があります。
query_hash
と query_parameterized_hash
の列を含むビューおよびテーブル関数の出力には、ハッシュの生成に使用されたロジックのバージョンを指定する以下の列も含まれます。
query_hash_version
query_parameterized_hash_version
これらの列のバージョン番号は NUMBER (例: ロジックの最初のバージョンは 1
、ロジックの2番目のバージョンは 2
など)です。
これらの列に異なる期間の異なるバージョン番号が含まれている場合は、これらのバージョン列を使用して同じクエリの異なるハッシュを識別することができます。例:
...
WHERE (query_hash = 'hash_from_v1' AND query_hash_version = 1)
OR (query_hash = 'hash_from_v2' AND query_hash_version = 2)