GET_QUERY_OPERATOR_STATS¶
完了したクエリ内の個別のクエリ演算子に関する統計を返します。この関数は、過去14日間に実行された任意の完了したクエリに対して実行できます。
この情報を使用して、クエリの構造を理解し、パフォーマンスの問題を引き起こすクエリ演算子(例: 結合演算子)を特定できます。
たとえば、この情報を使用して、最も多くのリソースを消費している演算子を特定できます。別の例として、この関数を使用して、入力行よりも多くの出力行を持つ結合を特定できます。これは、 「爆発」結合 (例: 意図しないデカルト積など)の兆候である可能性があります。
これらの統計は、 Snowsight の クエリプロファイル タブでも利用できます。 GET_QUERY_OPERATOR_STATS()
関数は、同じ情報をプログラムによるインターフェイス経由で利用できるようにします。
問題のあるクエリ演算子を見つける方法の詳細については、 クエリプロファイルによって特定される一般的なクエリの問題 をご参照ください。
構文¶
GET_QUERY_OPERATOR_STATS( <query_id> )
引数¶
query_id
クエリの ID。次を使用できます。
文字列リテラル(一重引用符で囲まれた文字列)。
クエリ ID を含む セッション変数。
LAST_QUERY_ID 関数の呼び出しからの戻り値。
戻り値¶
GET_QUERY_OPERATOR_STATS 関数は テーブル関数。クエリ内の各クエリ演算子に関する統計を含む行を返します。詳細については、以下の 出力 と 使用上の注意 セクションをご参照ください。
使用上の注意¶
この関数は、完了したクエリの統計のみを返します。
クエリを実行したウェアハウスに対する OPERATE または MONITOR の権限が必要です。
この関数は、指定されたクエリで使用される各クエリ演算子に関する詳細な統計を提供します。可能なクエリ演算子は次のとおりです。
Aggregate: 入力をグループ化し、集計関数を計算します。
CartesianJoin: 特殊な結合の型。
Delete: テーブルから記録を削除します。
ExternalFunction: 外部関数による処理を表します。
ExternalScan: ステージオブジェクトに保存されているデータへのアクセスを表します。
Filter: 記録をフィルターする操作を表します。
Flatten: VARIANT 記録を処理し、場合によっては指定されたパスでそれらをフラット化します。
Generator: TABLE(GENERATOR(...)) 構造を使用して記録を生成します。
GroupingSets: GROUPING SETS、 ROLLUP、 CUBE などの構造を表します。
Insert: INSERT または COPY 操作のいずれかにより、テーブルに記録を追加します。
InternalObject: 内部データオブジェクト(例: Information Schema または以前のクエリの結果)へのアクセスを表します。
Join: 特定の条件で2つの入力を結合します。
JoinFilter: クエリプランでさらに結合の条件に一致しない可能性があると識別できるタプルを削除する特別なフィルタリング操作。
Merge: テーブルで MERGE 操作を実行します。
Pivot: 列の一意の値を複数の列に変換し、必要な集計を実行します。
Result: クエリ結果を返します。
Sort: 特定の式の入力を順序付けます。
SortWithLimit: ソート後に入力シーケンスの一部、通常は
ORDER BY ... LIMIT ... OFFSET ...
構築の結果を生成します。TableScan: 単一のテーブルへのアクセスを表します。
UnionAll: 2つの入力を連結します。
Unload: ステージ内のテーブルからファイルにデータをエクスポートする COPY 操作を表します。
Unpivot: 列を行に変換することにより、テーブルを回転します。
Update: テーブル内の記録を更新します。
ValuesClause: VALUES 句で提供される値のリスト。
WindowFunction: ウィンドウ関数を計算します。
WithClause: SELECT ステートメントの本文より優先され、1つ以上の CTEs を定義します。
WithReference: WITH 句のインスタンス。
情報はテーブルとして返されます。テーブルの各行は、1つの演算子に対応します。行には、その演算子の実行の内訳とクエリ統計が含まれます。
行には、 演算子の属性 もリストされる場合があります(これらは演算子の型によって異なります)。
クエリの実行時間を詳細化する統計は、合計クエリで消費された時間の割合として表されます。
特定の統計の詳細については、 出力 (このトピック内)をご参照ください。
この関数はテーブル関数であるため、 FROM 句で使用し、
TABLE()
でラップする必要があります。例:select * from table(get_query_operator_stats(last_query_id()));
特定のクエリ(つまり、特定の UUID)の個別な実行に対してこの関数は決定論的です。毎回同じ値を返します。
ただし、同じクエリテキストを別の方法で実行すると、この関数は別のランタイム統計を返す可能性があります。統計は多くの要因に依存します。次の要因は、実行に大きな影響を与える可能性があるため、この関数によって返される統計にも大きな影響を与える可能性があります。
データの量。
マテリアライズドビュー の可用性と、それらのマテリアライズドビューが最後に更新されてからのデータへの変更(ある場合)。
クラスタリング の有無。
以前にキャッシュされたデータの有無。
仮想ウェアハウスのサイズ。
値は、ユーザーのクエリやデータ以外の要因によっても影響を受ける可能性があります。通常、これらの要因が及ぼす影響は大きくありません。次の要因が含まれます。
仮想ウェアハウスの初期化時間。
外部関数の待機時間。
出力¶
この関数は、次の列を返します。
列名 |
データ型 |
説明 |
---|---|---|
QUERY_ID |
VARCHAR |
SQL ステートメントのための内部、システム生成識別子であるクエリ ID。 |
STEP_ID |
NUMBER(38, 0) |
クエリプラン内のステップの識別子。 |
OPERATOR_ID |
NUMBER(38, 0) |
演算子の識別子。これはクエリ内で一意です。値は0から始まります。 |
PARENT_OPERATORS |
1つ以上の NUMBER(38, 0)を含む ARRAY |
この演算子の親演算子の識別子。これがクエリプランの最後の演算子(通常は結果演算子)の場合は NULL。 |
OPERATOR_TYPE |
VARCHAR |
クエリ演算子の型(例: |
OBJECT を含む VARIANT |
演算子に関する統計(例: 演算子からの出力行数)。 |
|
OBJECT を含む VARIANT |
演算子の実行時間に関する情報。 |
|
OBJECT を含む VARIANT |
演算子に関する情報。この情報は、演算子の型によって異なります。 |
演算子の特定の列に関する情報がない場合、値は NULL です。
これらの列の内、3つには OBJECTs が含まれています。各オブジェクトには、キーと値のペアが含まれています。以下のテーブルは、これらのテーブル内のキーに関する情報を示しています。
OPERATOR_STATISTICS¶
OPERATOR_STATISTICS
列の OBJECTs にあるフィールドは、演算子に関する追加情報を提供します。情報には次が含まれます。
キー |
ネストされたキー(該当する場合) |
データ型 |
説明 |
---|---|---|---|
|
データ操作言語(DML)クエリの統計。 |
||
|
DOUBLE |
1つまたは複数のテーブルに挿入された行の数。 |
|
|
DOUBLE |
テーブルで更新された行の数。 |
|
|
DOUBLE |
テーブルから削除された行の数。 |
|
|
DOUBLE |
データのエクスポート中にアンロードされた行の数。 |
|
|
外部関数の呼び出しに関する情報。 |
||
|
DOUBLE |
外部関数が呼び出された回数。(行が分割されるバッチの数、再試行の数(一時的なネットワークの問題がある場合)などにより、 SQL ステートメントのテキスト内にある外部関数呼び出しの数とは異なる場合がある。) |
|
|
DOUBLE |
外部関数に送信された行数。 |
|
|
DOUBLE |
外部関数から受信した行数。 |
|
|
DOUBLE |
外部関数に送信されたバイト数。キーに |
|
|
DOUBLE |
外部関数から受信したバイト数。キーに |
|
|
DOUBLE |
一時的なエラーによる再試行の数。 |
|
|
DOUBLE |
Snowflakeがデータを送信してから返されたデータを受信するまでの呼び出し(コール)あたりの平均時間(単位: ミリ秒)。 |
|
|
INTEGER |
4xxステータスコードを返した HTTP リクエストの合計数。 |
|
|
INTEGER |
5xxステータスコードを返した HTTP リクエストの合計数。 |
|
|
DOUBLE |
HTTP リクエストに成功した場合の平均遅延時間。 |
|
|
DOUBLE |
スロットリングが原因の速度低下による、成功したリクエストごとの平均オーバーヘッド(HTTP 429)。 |
|
|
DOUBLE |
HTTP 429エラーが原因で再試行されたバッチの数。 |
|
|
DOUBLE |
成功した HTTP リクエストの50パーセンタイルの遅延。成功したすべてのリクエストの50%で、完了までにかかった時間がこの時間未満。 |
|
|
DOUBLE |
成功した HTTP リクエストの90パーセンタイルの遅延。成功したすべてのリクエストの90%で、完了までにかかった時間がこの時間未満。 |
|
|
DOUBLE |
成功した HTTP リクエストの95パーセンタイルの遅延。成功したすべてのリクエストの95%で、完了までにかかった時間がこの時間未満。 |
|
|
DOUBLE |
成功した HTTP リクエストの99パーセンタイルの遅延。成功したすべてのリクエストの99%で、完了までにかかった時間がこの時間未満。 |
|
|
INTEGER |
入力行の数。これは、他の演算子からの入力エッジがない演算子では欠落している可能性があります。 |
|
|
クエリ中に実行されるI/O(入出力)操作に関する情報。 |
||
|
DOUBLE |
これまでに特定のテーブルについてスキャンされたデータの割合。 |
|
|
DOUBLE |
これまでにスキャンされたバイト数。 |
|
|
DOUBLE |
ローカルディスクキャッシュからスキャンされたデータの割合。 |
|
|
DOUBLE |
書き込まれたバイト数(例: テーブルへのロード時)。 |
|
|
DOUBLE |
結果オブジェクトに書き込まれるバイト数。 たとえば、 一般に、結果オブジェクトは、なんであれクエリの結果として生成されるものを表し、 |
|
|
DOUBLE |
結果オブジェクトから読み取ったバイト数。 |
|
|
DOUBLE |
外部オブジェクト(例: ステージ)から読み取ったバイト数。 |
|
|
|
DOUBLE |
ネットワーク経由で送信されたデータの量。 |
|
INTEGER |
出力行の数。これは、結果をユーザーに返す演算子(通常は RESULT 演算子)では欠落している可能性があります。 |
|
|
テーブルのプルーニングに関する情報。 |
||
|
DOUBLE |
これまでにスキャンされたパーティションの数。 |
|
|
DOUBLE |
特定のテーブル内にあるパーティションの総数。 |
|
|
中間結果がメモリに収まらない操作のディスク使用量に関する情報。 |
||
|
DOUBLE |
リモートディスクにスピルしたデータの量。 |
|
|
DOUBLE |
ローカルディスクにスピルしたデータの量。 |
|
|
拡張関数の呼び出しに関する情報。フィールドの値がゼロの場合、フィールドは表示されません。 |
||
|
DOUBLE |
Java UDF ハンドラーのロード時間。 |
|
|
DOUBLE |
Java UDF ハンドラーが呼び出される回数。 |
|
|
DOUBLE |
Java UDF ハンドラーの最大実行時間。 |
|
|
DOUBLE |
Java UDF ハンドラーの平均実行時間。 |
|
|
DOUBLE |
Java UDTF プロセスメソッド が呼び出された回数。 |
|
|
DOUBLE |
Java UDTF プロセスの実行時間。 |
|
|
DOUBLE |
Java UDTF プロセスの平均実行時間。 |
|
|
DOUBLE |
Java UDTF コンストラクター が呼び出された回数。 |
|
|
DOUBLE |
Java UDTF コンストラクターの実行時間。 |
|
|
DOUBLE |
Java UDTF コンストラクターの平均実行時間。 |
|
|
DOUBLE |
Java UDTF endPartitionメソッド が呼び出された回数。 |
|
|
DOUBLE |
Java UDTF endPartitionメソッドの実行時間。 |
|
|
DOUBLE |
Java UDTF endPartitionメソッドの平均実行時間。 |
|
|
DOUBLE |
Java UDF の依存関係のダウンロードにかかる最大時間。 |
|
|
DOUBLE |
JVM によって報告されたピークメモリ使用量。 |
|
|
DOUBLE |
Java UDF インラインコードのコンパイル時間。 |
|
|
DOUBLE |
Python UDF ハンドラーが呼び出された回数。 |
|
|
DOUBLE |
Python UDF ハンドラーの合計実行時間。 |
|
|
DOUBLE |
Python UDF ハンドラーの平均実行時間。 |
|
|
DOUBLE |
Pythonサンドボックス環境によるピークメモリ使用量。 |
|
|
DOUBLE |
パッケージのダウンロードとインストールを含むPython環境の作成にかかる平均時間。 |
|
|
DOUBLE |
Pythonパッケージを解決するためにCondaソルバーを実行する時間。 |
|
|
DOUBLE |
Python環境の作成にかかる時間。 |
|
|
DOUBLE |
Python UDF の初期化にかかる時間。 |
|
|
DOUBLE |
UDFs で読み取った外部ファイルのバイト数。 |
|
|
DOUBLE |
UDFs のためにアクセスした外部ファイルの数。 |
EXECUTION_TIME_BREAKDOWN¶
EXECUTION_TIME_BREAKDOWN
列の OBJECTs にあるフィールドを以下に示します。
キー |
データ型 |
説明 |
---|---|---|
|
DOUBLE |
この演算子が費やした合計クエリ時間の割合。 |
|
DOUBLE |
クエリ処理の設定にかかった時間。 |
|
DOUBLE |
CPU によるデータの処理にかかった時間。 |
|
DOUBLE |
関与しているプロセス間のアクティビティの同期に費やされた時間。 |
|
DOUBLE |
ローカルディスクアクセスの待機中に処理がブロックされた時間。 |
|
DOUBLE |
リモートディスクアクセスの待機中に処理がブロックされた時間。 |
|
DOUBLE |
処理がネットワークデータ転送を待機していた時間。 |
OPERATOR_ATTRIBUTES¶
各出力行には、クエリ内にある1つの演算子が記述されています。以下のテーブルは、使用可能な演算子の型(例: フィルター演算子)を示しています。演算子の型ごとに、可能性のある属性(例: 行のフィルターに使用される式)をテーブルに示します。
演算子の属性は、 VARIANT 型で OBJECT を含む OPERATOR_ATTRIBUTES
列に格納されます。OBJECT にはキーと値のペアが含まれています。各キーは、演算子の属性1つに対応します。
演算子名 |
キー |
データ型 |
説明 |
---|---|---|---|
|
|||
|
VARCHAR の ARRAY |
コンピューティングされた関数のリスト。 |
|
|
VARCHAR の ARRAY |
グループバイ式。 |
|
|
|||
|
VARCHAR |
非等価結合式。 |
|
|
VARCHAR |
等値結合式。 |
|
|
VARCHAR |
結合の型(INNER)。 |
|
|
|
VARCHAR |
更新されたテーブルの名前。 |
|
|||
|
VARCHAR |
データが読み取られるステージの名前。 |
|
|
VARCHAR |
ステージのタイプ。 |
|
|
|
VARCHAR |
データのフィルターに使用される式。 |
|
|
VARCHAR |
データをフラット化するために使用される入力式。 |
|
|||
|
NUMBER |
入力パラメーター ROWCOUNT の値。 |
|
|
NUMBER |
入力パラメーター TIMELIMIT の値。 |
|
|
|||
|
VARCHAR の ARRAY |
コンピューティングされた関数のリスト。 |
|
|
VARCHAR の ARRAY |
グループ化セットのリスト。 |
|
|
|||
|
VARCHAR |
挿入される式。 |
|
|
VARCHAR の ARRAY |
記録が追加されるテーブル名のリスト。 |
|
|
|
VARCHAR |
アクセスされた列の名前。 |
|
|||
|
VARCHAR |
非等価結合式。 |
|
|
VARCHAR |
等値結合式。 |
|
|
VARCHAR |
結合の型(INNER、 OUTER、 LEFT、 JOIN など) |
|
|
|
NUMBER |
除外できるタプルを識別するために使用される結合の演算子ID。 |
|
|
VARCHAR |
更新されたテーブルの名前。 |
|
|||
|
VARCHAR の ARRAY |
結果が集計される残りの列。 |
|
|
VARCHAR の ARRAY |
ピボット値の結果の列。 |
|
|
|
VARCHAR の ARRAY |
生成された式。 |
|
|
VARCHAR の ARRAY |
ソート順を定義する式。 |
|
|||
|
NUMBER |
生成されたタプルが発行される順序付けられたシーケンス内の位置。 |
|
|
NUMBER |
生成された行の数。 |
|
|
VARCHAR の ARRAY |
ソート順を定義する式。 |
|
|
|||
|
VARCHAR の ARRAY |
スキャンされた列のリスト |
|
|
VARCHAR の ARRAY |
バリアント列から抽出されたパスのリスト。 |
|
|
VARCHAR |
アクセスされているテーブルのエイリアス。 |
|
|
VARCHAR |
アクセスされているテーブルの名前。 |
|
|
|
VARCHAR |
データが保存されるステージ。 |
|
|
VARCHAR の ARRAY |
ピボット解除クエリの出力列。 |
|
|
VARCHAR |
更新されたテーブルの名前。 |
|
|||
|
NUMBER |
生成された値の数。 |
|
|
VARCHAR |
値のリスト。 |
|
|
|
VARCHAR の ARRAY |
コンピューティングされた関数のリスト。 |
|
|
VARCHAR |
WITH 句のエイリアス。 |
演算子がリストされていない場合は、属性が生成されず、値は {}
として報告されます。
注釈
次の演算子には演算子の属性がないため、
OPERATOR_ATTRIBUTES
の テーブル には含まれません。UnionAll
ExternalFunction
例¶
単一のクエリに関するデータの取得¶
この例は、2つの小さなテーブルを結合する SELECT の統計を示しています。
SELECT ステートメントを実行します。
select x1.i, x2.i
from x1 inner join x2 on x2.i = x1.i
order by x1.i, x2.i;
クエリ ID を取得します。
set lqid = (select last_query_id());
GET_QUERY_OPERATOR_STATS() を呼び出して、クエリ内の個々のクエリ演算子に関する統計を取得します。
select * from table(get_query_operator_stats($lqid));
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
| QUERY_ID | STEP_ID | OPERATOR_ID | PARENT_OPERATORS | OPERATOR_TYPE | OPERATOR_STATISTICS | EXECUTION_TIME_BREAKDOWN | OPERATOR_ATTRIBUTES |
|--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------|
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 0 | NULL | Result | { | { | { |
| | | | | | "input_rows": 64 | "overall_percentage": 0.000000000000000e+00 | "expressions": [ |
| | | | | | } | } | "X1.I", |
| | | | | | | | "X2.I" |
| | | | | | | | ] |
| | | | | | | | } |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 1 | [ 0 ] | Sort | { | { | { |
| | | | | | "input_rows": 64, | "overall_percentage": 0.000000000000000e+00 | "sort_keys": [ |
| | | | | | "output_rows": 64 | } | "X1.I ASC NULLS LAST", |
| | | | | | } | | "X2.I ASC NULLS LAST" |
| | | | | | | | ] |
| | | | | | | | } |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 2 | [ 1 ] | Join | { | { | { |
| | | | | | "input_rows": 128, | "overall_percentage": 0.000000000000000e+00 | "equality_join_condition": "(X2.I = X1.I)", |
| | | | | | "output_rows": 64 | } | "join_type": "INNER" |
| | | | | | } | | } |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 3 | [ 2 ] | TableScan | { | { | { |
| | | | | | "io": { | "overall_percentage": 0.000000000000000e+00 | "columns": [ |
| | | | | | "bytes_scanned": 1024, | } | "I" |
| | | | | | "percentage_scanned_from_cache": 1, | | ], |
| | | | | | "scan_progress": 1 | | "table_name": "MY_DB.MY_SCHEMA.X2" |
| | | | | | }, | | } |
| | | | | | "output_rows": 64, | | |
| | | | | | "pruning": { | | |
| | | | | | "partitions_scanned": 1, | | |
| | | | | | "partitions_total": 1 | | |
| | | | | | } | | |
| | | | | | } | | |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 4 | [ 2 ] | JoinFilter | { | { | { |
| | | | | | "input_rows": 64, | "overall_percentage": 0.000000000000000e+00 | "join_id": "2" |
| | | | | | "output_rows": 64 | } | } |
| | | | | | } | | |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 5 | [ 4 ] | TableScan | { | { | { |
| | | | | | "io": { | "overall_percentage": 0.000000000000000e+00 | "columns": [ |
| | | | | | "bytes_scanned": 1024, | } | "I" |
| | | | | | "percentage_scanned_from_cache": 1, | | ], |
| | | | | | "scan_progress": 1 | | "table_name": "MY_DB.MY_SCHEMA.X1" |
| | | | | | }, | | } |
| | | | | | "output_rows": 64, | | |
| | | | | | "pruning": { | | |
| | | | | | "partitions_scanned": 1, | | |
| | | | | | "partitions_total": 1 | | |
| | | | | | } | | |
| | | | | | } | | |
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
「爆発」結合演算子の特定¶
次の例は、 GET_QUERY_OPERATOR_STATS を使用して複雑なクエリを調べる方法を示しています。この例では、その演算子に入力されたよりも多くの行を生成するクエリ内の演算子を検索します。
分析するクエリは次のとおりです。
select *
from t1
join t2 on t1.a = t2.a
join t3 on t1.b = t3.b
join t4 on t1.c = t4.c
;
以前のクエリのクエリ ID を取得します。
set lid = last_query_id();
次のクエリは、クエリ内の各結合演算子の入力行に対する出力行の比率を示しています。
select
operator_id,
operator_attributes,
operator_statistics:output_rows / operator_statistics:input_rows as row_multiple
from table(get_query_operator_stats($lid))
where operator_type = 'Join'
order by step_id, operator_id;
+---------+-------------+--------------------------------------------------------------------------+---------------+
| STEP_ID | OPERATOR_ID | OPERATOR_ATTRIBUTES | ROW_MULTIPLE |
+---------+-------------+--------------------------------------------------------------------------+---------------+
| 1 | 1 | { "equality_join_condition": "(T4.C = T1.C)", "join_type": "INNER" } | 49.969249692 |
| 1 | 3 | { "equality_join_condition": "(T3.B = T1.B)", "join_type": "INNER" } | 116.071428571 |
| 1 | 5 | { "equality_join_condition": "(T2.A = T1.A)", "join_type": "INNER" } | 12.20657277 |
+---------+-------------+--------------------------------------------------------------------------+---------------+
爆発結合を特定した後、各結合条件を調べて、条件が正しいことを確認できます。