カテゴリ:

システム関数 (クエリ情報)、 テーブル関数

GET_QUERY_OPERATOR_STATS

完了したクエリ内の個別のクエリ演算子に関する統計を返します。この関数は、過去14日間に実行された任意の完了したクエリに対して実行できます。

この情報を使用して、クエリの構造を理解し、パフォーマンスの問題を引き起こすクエリ演算子(例: 結合演算子)を特定できます。

たとえば、この情報を使用して、最も多くのリソースを消費している演算子を特定できます。別の例として、この関数を使用して、入力行よりも多くの出力行を持つ結合を特定できます。これは、 「爆発」結合 (例: 意図しないデカルト積など)の兆候である可能性があります。

これらの統計は、 Snowsight の クエリプロファイル タブでも利用できます。 GET_QUERY_OPERATOR_STATS() 関数は、同じ情報をプログラムによるインターフェイス経由で利用できるようにします。

問題のあるクエリ演算子を見つける方法の詳細については、 クエリプロファイルによって識別される一般的なクエリの問題 をご参照ください。

構文

GET_QUERY_OPERATOR_STATS( <query_id> )
Copy

引数

query_id

クエリの ID。次を使用できます。

  • 文字列リテラル(一重引用符で囲まれた文字列)。

  • クエリ ID を含む セッション変数

  • LAST_QUERY_ID 関数の呼び出しからの戻り値。

戻り値

GET_QUERY_OPERATOR_STATS 関数は テーブル関数。クエリ内の各クエリ演算子に関する統計を含む行を返します。詳細については、以下の 出力使用上の注意 セクションをご参照ください。

使用上の注意

  • この関数は、完了したクエリの統計のみを返します。

  • この関数は、指定されたクエリで使用される各クエリ演算子に関する詳細な統計を提供します。可能なクエリ演算子は次のとおりです。

    • 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: ウィンドウ関数を計算します。

  • 情報はテーブルとして返されます。テーブルの各行は、1つの演算子に対応します。行には、その演算子の実行の内訳とクエリ統計が含まれます。

    行には、 演算子の属性 もリストされる場合があります(これらは演算子の型によって異なります)。

    クエリの実行時間を詳細化する統計は、合計クエリで消費された時間の割合として表されます。

    特定の統計の詳細については、 出力 (このトピック内)をご参照ください。

  • この関数はテーブル関数であるため、 FROM 句で使用し、 TABLE() でラップする必要があります。例:

    select *
        from table(get_query_operator_stats(last_query_id()));
    
    Copy
  • 特定のクエリ(つまり、特定の UUID)の個別な実行に対してこの関数は決定論的です。毎回同じ値を返します。

    ただし、同じクエリテキストを別の方法で実行すると、この関数は別のランタイム統計を返す可能性があります。統計は多くの要因に依存します。次の要因は、実行に大きな影響を与える可能性があるため、この関数によって返される統計にも大きな影響を与える可能性があります。

    • データの量。

    • マテリアライズドビュー の可用性と、それらのマテリアライズドビューが最後に更新されてからのデータへの変更(ある場合)。

    • クラスタリング の有無。

    • 以前にキャッシュされたデータの有無。

    • 仮想ウェアハウスのサイズ。

    値は、ユーザーのクエリやデータ以外の要因によっても影響を受ける可能性があります。通常、これらの要因が及ぼす影響は大きくありません。次の要因が含まれます。

    • 仮想ウェアハウスの初期化時間。

    • 外部関数の待機時間。

出力

この関数は、次の列を返します。

列名

データ型

説明

QUERY_ID

VARCHAR

SQL ステートメントのための内部、システム生成識別子であるクエリ ID。

STEP_ID

NUMBER(38, 0)

クエリプラン内のステップの識別子。

OPERATOR_ID

NUMBER(38, 0)

演算子の識別子。これはクエリ内で一意です。値は0から始まります。

PARENT_OPERATOR_ID

NUMBER(38, 0)

この演算子の親演算子の識別子。これがクエリプランの最後の演算子(通常は結果演算子)の場合は NULL。

OPERATOR_TYPE

VARCHAR

クエリ演算子の型(例: TableScan または Filter)。

OPERATOR_STATISTICS

OBJECT を含む VARIANT

演算子に関する統計(例: 演算子からの出力行数)。

EXECUTION_TIME_BREAKDOWN

OBJECT を含む VARIANT

演算子の実行時間に関する情報。

OPERATOR_ATTRIBUTES

OBJECT を含む VARIANT

演算子に関する情報。この情報は、演算子の型によって異なります。

演算子の特定の列に関する情報がない場合、値は NULL です。

これらの列の内、3つには OBJECTs が含まれています。各オブジェクトには、キーと値のペアが含まれています。以下のテーブルは、これらのテーブル内のキーに関する情報を示しています。

OPERATOR_STATISTICS

OPERATOR_STATISTICS 列の OBJECTs にあるフィールドは、演算子に関する追加情報を提供します。情報には次が含まれます。

キー

ネストされたキー(該当する場合)

データ型

説明

dml

データ操作言語(DML)クエリの統計。

number_of_rows_inserted

DOUBLE

1つまたは複数のテーブルに挿入された行の数。

number_of_rows_updated

DOUBLE

テーブルで更新された行の数。

number_of_rows_deleted

DOUBLE

テーブルから削除された行の数。

number_of_rows_unloaded

DOUBLE

データのエクスポート中にアンロードされた行の数。

external_functions

外部関数の呼び出しに関する情報。 retries_due_to_transient_errors などのフィールドの値がゼロの場合、フィールドは表示されません。

total_invocations

DOUBLE

外部関数が呼び出された回数。(行が分割されるバッチの数、再試行の数(一時的なネットワークの問題がある場合)などにより、 SQL ステートメントのテキスト内にある外部関数呼び出しの数とは異なる場合がある。)

rows_sent

DOUBLE

外部関数に送信された行数。

rows_received

DOUBLE

外部関数から受信した行数。

bytes_sent (x-region)

DOUBLE

外部関数に送信されたバイト数。キーに (x-region) が含まれている場合、データは複数のリージョンに送信されています(請求に影響する可能性あり)。

bytes_received (x-region)

DOUBLE

外部関数から受信したバイト数。キーに (x-region) が含まれている場合、データは複数のリージョンに送信されています(請求に影響する可能性あり)。

retries_due_to_transient_errors

DOUBLE

一時的なエラーによる再試行の数。

average_latency_per_call

DOUBLE

Snowflakeがデータを送信してから返されたデータを受信するまでの呼び出し(コール)あたりの平均時間(単位: ミリ秒)。

input_rows

INTEGER

入力行の数。これは、他の演算子からの入力エッジがない演算子では欠落している可能性があります。

io

クエリ中に実行されるI/O(入出力)操作に関する情報。

scan_progress

DOUBLE

これまでに特定のテーブルについてスキャンされたデータの割合。

bytes_scanned

DOUBLE

これまでにスキャンされたバイト数。

percentage_scanned_from_cache

DOUBLE

ローカルディスクキャッシュからスキャンされたデータの割合。

bytes_written

DOUBLE

書き込まれたバイト数(例: テーブルへのロード時)。

bytes_written_to_result

DOUBLE

結果オブジェクトに書き込まれるバイト数。

たとえば、 select * from . . . は、選択範囲の各フィールドを表す表形式の結果のセットを生成します。

一般に、結果オブジェクトは、なんであれクエリの結果として生成されるものを表し、 bytes_written_to_result は、返される結果のサイズを表します。

bytes_read_from_result

DOUBLE

結果オブジェクトから読み取ったバイト数。

external_bytes_scanned

DOUBLE

外部オブジェクト(例: ステージ)から読み取ったバイト数。

network

network_bytes

DOUBLE

ネットワーク経由で送信されたデータの量。

output_rows

INTEGER

出力行の数。これは、結果をユーザーに返す演算子(通常は RESULT 演算子)では欠落している可能性があります。

pruning

テーブルのプルーニングに関する情報。

partitions_scanned

DOUBLE

これまでにスキャンされたパーティションの数。

partitions_total:

DOUBLE

特定のテーブル内にあるパーティションの総数。

spilling

中間結果がメモリに収まらない操作のディスク使用量に関する情報。

bytes_spilled_remote_storage

DOUBLE

リモートディスクにスピルしたデータの量。

bytes_spilled_local_storage

DOUBLE

ローカルディスクにスピルしたデータの量。

EXECUTION_TIME_BREAKDOWN

EXECUTION_TIME_BREAKDOWN 列の OBJECTs にあるフィールドを以下に示します。

キー

データ型

説明

overall_percentage

DOUBLE

この演算子が費やした合計クエリ時間の割合。

initialization

DOUBLE

クエリ処理の設定にかかった時間。

processing

DOUBLE

CPU によるデータの処理にかかった時間。

synchronization

DOUBLE

関与しているプロセス間のアクティビティの同期に費やされた時間。

local_disk_io

DOUBLE

ローカルディスクアクセスの待機中に処理がブロックされた時間。

remote_disk_io

DOUBLE

リモートディスクアクセスの待機中に処理がブロックされた時間。

network_communication

DOUBLE

処理がネットワークデータ転送を待機していた時間。

OPERATOR_ATTRIBUTES

各出力行には、クエリ内にある1つの演算子が記述されています。以下のテーブルは、使用可能な演算子の型(例: フィルター演算子)を示しています。演算子の型ごとに、可能性のある属性(例: 行のフィルターに使用される式)をテーブルに示します。

演算子の属性は、 VARIANT 型で OBJECT を含む OPERATOR_ATTRIBUTES 列に格納されます。OBJECT にはキーと値のペアが含まれています。各キーは、演算子の属性1つに対応します。

演算子名

キー

データ型

説明

Aggregate

functions

VARCHAR の ARRAY

コンピューティングされた関数のリスト。

grouping_keys

VARCHAR の ARRAY

グループバイ式。

CartesianJoin

additional_join_condition

VARCHAR

非等価結合式。

equality_join_condition

VARCHAR

等値結合式。

join_type

VARCHAR

結合の型(INNER)。

Delete

table_name

VARCHAR

更新されたテーブルの名前。

ExternalScan

stage_name

VARCHAR

データが読み取られるステージの名前。

stage_type

VARCHAR

ステージのタイプ。

Filter

filter_condition

VARCHAR

データのフィルターに使用される式。

Flatten

input

VARCHAR

データをフラット化するために使用される入力式。

Generator

row_count

NUMBER

入力パラメーター ROWCOUNT の値。

time_limit

NUMBER

入力パラメーター TIMELIMIT の値。

GroupingSets

functions

VARCHAR の ARRAY

コンピューティングされた関数のリスト。

key_sets

VARCHAR の ARRAY

グループ化セットのリスト。

Insert

input_expression

VARCHAR

挿入される式。

table_names

VARCHAR の ARRAY

記録が追加されるテーブル名のリスト。

InternalObject

object_name

VARCHAR

アクセスされた列の名前。

Join

additional_join_condition

VARCHAR

非等価結合式。

equality_join_condition

VARCHAR

等値結合式。

join_type

VARCHAR

結合の型(INNER、 OUTER、 LEFT、 JOIN など)

JoinFilter

join_id

NUMBER

除外できるタプルを識別するために使用される結合の演算子ID。

Merge

table_name

VARCHAR

更新されたテーブルの名前。

Pivot

grouping_keys

VARCHAR の ARRAY

結果が集計される残りの列。

pivot_column

VARCHAR の ARRAY

ピボット値の結果の列。

Result

expressions

VARCHAR の ARRAY

生成された式。

Sort

sort_keys

VARCHAR の ARRAY

ソート順を定義する式。

SortWithLimit

offset

NUMBER

生成されたタプルが発行される順序付けられたシーケンス内の位置。

rows

NUMBER

生成された行の数。

sort_keys

VARCHAR の ARRAY

ソート順を定義する式。

TableScan

columns

VARCHAR の ARRAY

スキャンされた列のリスト

extracted_variant_paths

VARCHAR の ARRAY

バリアント列から抽出されたパスのリスト。

table_alias

VARCHAR

アクセスされているテーブルのエイリアス。

table_name

VARCHAR

アクセスされているテーブルの名前。

Unload

location

VARCHAR

データが保存されるステージ。

Unpivot

expressions

VARCHAR の ARRAY

ピボット解除クエリの出力列。

Update

table_name

VARCHAR

更新されたテーブルの名前。

ValuesClause

value_count

NUMBER

生成された値の数。

values

VARCHAR

値のリスト。

WindowFunction

functions

VARCHAR の ARRAY

コンピューティングされた関数のリスト。

演算子がリストされていない場合は、属性が生成されず、値は {} として報告されます。

注釈

  • 次の演算子には演算子の属性がないため、 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;
Copy

クエリ ID を取得します。

set lqid = (select last_query_id());
Copy

GET_QUERY_OPERATOR_STATS() を呼び出して、クエリ内の個々のクエリ演算子に関する統計を取得します。

select * from table(get_query_operator_stats($lqid));
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
| QUERY_ID                             | STEP_ID | OPERATOR_ID | PARENT_OPERATOR_ID | 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               |                                               |                                                                      |
|                                      |         |             |                    |               |   }                                     |                                               |                                                                      |
|                                      |         |             |                    |               | }                                       |                                               |                                                                      |
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
Copy

「爆発」結合演算子の特定

次の例は、 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
;
Copy

以前のクエリのクエリ ID を取得します。

set lid = last_query_id();
Copy

次のクエリは、クエリ内の各結合演算子の入力行に対する出力行の比率を示しています。

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  |
+---------+-------------+--------------------------------------------------------------------------+---------------+
Copy

爆発結合を特定した後、各結合条件を調べて、条件が正しいことを確認できます。