Query Acceleration Serviceの使用

Query Acceleration Serviceは、ウェアハウス内のクエリワークロードの一部を高速化できます。ウェアハウスに対して有効にすると、通常のクエリよりも多くのリソースを使用するクエリである外れ値クエリの影響を減らすことで、ウェアハウス全体のパフォーマンスを向上させることができます。Query Acceleration Serviceは、クエリ処理作業の一部をサービスによって提供される共有コンピューティングリソースにオフロードして、これを実現します。

Query Acceleration Serviceのメリットを受ける可能性があるワークロードのタイプの例は次のとおりです。

  • アドホック分析。

  • クエリごとのデータ量が予測できないワークロード。

  • 大規模なスキャンと選択フィルターを使用したクエリ。

Query Acceleration Serviceは、より多くの作業を並行して実行し、スキャンとフィルタリングに費やされるウォールクロック時間を短縮することで、これらのタイプのワークロードをより効率的に処理できます。

注釈

Query Acceleration Serviceは、サーバーの可用性によって異なります。したがって、パフォーマンスの向上は時間の経過とともに変動する可能性があります。

このトピックの内容:

Query Accelerationのメリットを受ける可能性のあるクエリとウェアハウスの識別

Query Acceleration Serviceのメリットを受ける可能性のあるクエリを識別するには、 SYSTEM$ESTIMATE_QUERY_ACCELERATION 関数を使用するか、 QUERY_ACCELERATION_ELIGIBLE ビュー をクエリします。QUERY_ACCELERATION_ELIGIBLE ビューは、Query Acceleration Serviceのメリットを受ける可能性のあるウェアハウスも識別します。

不適格なクエリ

一部のクエリは、クエリアクセラレーションの対象外です。クエリを高速化できない一般的な理由は次のとおりです。

  • フィルターや集計(つまり、 GROUP BY)がない。Query Acceleration Serviceは現在、このようなクエリを高速化できません。

  • フィルターの選択性が十分ではない。または、 GROUP BY 式のカーディナリティが高くなっている。

  • 十分なパーティションがない。スキャンするために十分なパーティションがないと、クエリアクセラレーションの利点は、サービス用に追加のサーバーを取得する際の待機時間によって相殺されます。

  • Query Acceleration Serviceは、 検索最適化 が有効になっているテーブルのクエリは高速化しません。

  • クエリに LIMIT 句が含まれている。ただし、 ORDER BY 句を含んでいる LIMIT 句はサポート されます

SYSTEM$ESTIMATE_QUERY_ACCELERATION 関数を使用したクエリの識別

SYSTEM$ESTIMATE_QUERY_ACCELERATION 関数は、以前に実行されたクエリが、Query Acceleration Serviceのメリットを受ける可能性があるかどうかを判断するのに役立ちます。クエリがクエリアクセラレーションの対象である場合、関数はさまざまなクエリのアクセラレーション スケールファクター の推定クエリ実行時間を返します。

次のステートメントを実行して、クエリアクセラレーションが特定のクエリに役立つかどうかを判断します。

select parse_json(system$estimate_query_acceleration('8cd54bf0-1651-5b1c-ac9c-6a9582ebd20f'));
Copy

この例では、クエリはQuery Acceleration Serviceの対象であり、サービスを使用した推定クエリ時間が含まれています。

{
  "estimatedQueryTimes": {
    "1": 171,
    "10": 115,
    "2": 152,
    "4": 133,
    "8": 120
  },
  "originalQueryTime": 300.291,
  "queryUUID": "8cd54bf0-1651-5b1c-ac9c-6a9582ebd20f",
  "status": "eligible",
  "upperLimitScaleFactor": 10
}
Copy

次の例は、Query Acceleration Serviceの対象とならないクエリの結果を示しています。

select parse_json(system$estimate_query_acceleration('cf23522b-3b91-cf14-9fe0-988a292a4bfa'));
Copy

上記のステートメントは、次の出力を生成します。

{
  "estimatedQueryTimes": {},
  "originalQueryTime": 20.291,
  "queryUUID": "cf23522b-3b91-cf14-9fe0-988a292a4bfa",
  "status": "ineligible",
  "upperLimitScaleFactor": 0
}
Copy

QUERY_ACCELERATION_ELIGIBLE ビューを使用したクエリとウェアハウスの識別

QUERY_ACCELERATION_ELIGIBLE ビュー をクエリして、Query Acceleration Serviceから最もメリットを受ける可能性のあるクエリとウェアハウスを識別します。ビューには、クエリごとに、Query Acceleration Serviceの対象となるクエリ実行時間が含まれます。

注釈

これらの例では、 ACCOUNTADMIN ロール(または共有 SNOWFLAKE データベースで IMPORTED PRIVILEGES が付与されたロール)が使用されていることを想定しています。使用されていない場合は、例にあるクエリを実行する前に次のコマンドを実行します。

USE ROLE ACCOUNTADMIN;
Copy

アクセラレーションの対象となるクエリ実行時間の量によって、サービスから最もメリットを受ける可能性のあるクエリを識別します。

SELECT query_id, eligible_query_acceleration_time
FROM snowflake.account_usage.query_acceleration_eligible
ORDER BY eligible_query_acceleration_time DESC;
Copy

特定のウェアハウス mywh でサービスから最もメリットを受ける可能性のあるクエリを識別します。

SELECT query_id, eligible_query_acceleration_time
FROM snowflake.account_usage.query_acceleration_eligible
WHERE warehouse_name = 'mywh'
ORDER BY eligible_query_acceleration_time DESC;
Copy

Query Acceleration Serviceの対象となるクエリが最も多い、特定の期間のウェアハウスを識別します。

SELECT warehouse_name, COUNT(query_id) AS num_eligible_queries
FROM snowflake.account_usage.query_acceleration_eligible
WHERE start_time > 'Tue, 18 January 2022 12:00:00'::timestamp
AND end_time < 'Tue, 19 January 2022 00:00:00'::timestamp
GROUP BY warehouse_name
ORDER BY num_eligible_queries DESC;
Copy

Query Acceleration Serviceから最もメリットを受ける可能性のあるウェアハウスを識別します。ウェアハウスごとに、アクセラレーションの対象となるクエリ実行の合計時間を計算します。

SELECT warehouse_name, SUM(eligible_query_acceleration_time) AS total_eligible_time
FROM snowflake.account_usage.query_acceleration_eligible
GROUP BY warehouse_name
ORDER BY total_eligible_time DESC;
Copy

特定のウェアハウスに対する、Query Acceleration Serviceの上限 スケールファクター を識別します。

SELECT MAX(upper_limit_scale_factor)
FROM snowflake.account_usage.query_acceleration_eligible
WHERE warehouse_name = 'mywh';
Copy

Query Accelerationの有効化

ウェアハウスの作成時(CREATE WAREHOUSE を使用)またはそれ以降(ALTER WAREHOUSE を使用)に ENABLE_QUERY_ACCELERATION = TRUE を指定して、Query Acceleration Serviceを有効にします。

注釈

Query Acceleration Serviceは、 検索最適化 が有効になっているテーブルのクエリは高速化しません。

サポートされている SQL コマンド

Query Acceleration Serviceは、次の SQL コマンドをサポートしています。

  • SELECT

  • INSERT (ステートメントに SELECT ステートメントが含まれる場合)

  • CREATE TABLE AS SELECT (CTAS)

サポートされている SQL コマンドを使用したクエリ、またはクエリの一部(つまり、サブクエリまたは句)は、高速化の対象である場合、Query Acceleration Serviceによって高速化される可能性があります。

次の例では、 my_wh という名前のウェアハウスのQuery Acceleration Serviceを有効にします。

create warehouse my_wh with
  ENABLE_QUERY_ACCELERATION = true;
Copy

SHOW WAREHOUSES コマンドを実行して、 my_wh ウェアハウスに関する詳細を表示します。

show warehouses like 'my_wh';

+---------+---------+----------+---------+---------+--------+------------+------------+--------------+-------------+-----------+--------------+-----------+-------+-------------------------------+-------------------------------+-------------------------------+--------------+---------+---------------------------+-------------------------------------+------------------+---------+----------+--------+-----------+------------+
| name    | state   | type     | size    | running | queued | is_default | is_current | auto_suspend | auto_resume | available | provisioning | quiescing | other | created_on                    | resumed_on                    | updated_on                    | owner        | comment | enable_query_acceleration | query_acceleration_max_scale_factor | resource_monitor | actives | pendings | failed | suspended | uuid       |
|---------+---------+----------+---------+---------+--------+------------+------------+--------------+-------------+-----------+--------------+-----------+-------+-------------------------------+-------------------------------+-------------------------------+--------------+---------+---------------------------+-------------------------------------+------------------+---------+----------+--------+-----------+------------|
| MY_WH   | SUSPENDED | STANDARD | Medium |       0 |      0 | N          | N          |          600 | true        |           |              |           |       | 2023-01-20 14:31:49.283 -0800 | 2023-01-20 14:31:49.388 -0800 | 2023-01-20 16:34:28.583 -0800 | ACCOUNTADMIN |         | true                      |                                   8 | null             |       0 |        0 |      0 |         4 | 1132659053 |
+---------+---------+----------+---------+---------+--------+------------+------------+--------------+-------------+-----------+--------------+-----------+-------+-------------------------------+-------------------------------+-------------------------------+--------------+---------+---------------------------+-------------------------------------+------------------+---------+----------+--------+-----------+------------+
Copy

Query Acceleration Serviceは、ウェアハウスのクレジット消費率を高める可能性があります。最大スケールファクターは、消費率を制限するのに役立ちます。 QUERY_ACCELERATION_MAX_SCALE_FACTOR プロパティの詳細については、 CREATE WAREHOUSE または ALTER WAREHOUSE をご参照ください。

QUERY_ACCELERATION_ELIGIBLE ビューと SYSTEM$ESTIMATE_QUERY_ACCELERATION 関数は、ウェアハウスの適切なスケールファクターを決定するのに役立つ場合があります。詳細については、 Query Accelerationのメリットを受ける可能性のあるクエリとウェアハウスの識別 (このトピック内)をご参照ください。

スケールファクターの調整

スケールファクターは、ウェアハウスがクエリアクセラレーションのためにリースするコンピューティングリソースの量に上限を設定できる コスト管理 メカニズムです。この値は、ウェアハウスサイズとコストに基づく乗数として使用されます。

たとえば、Mサイズのウェアハウスのスケールファクターを5に設定するとします。これは、

  • ウェアハウスは、Mサイズのウェアハウスの5倍までコンピューティングリソースをリースできます。

  • Mサイズのウェアハウスのコストは 1時間あたり4クレジット であるため、これらのリソースをリースすると、1時間あたり最大20クレジット(ウェアハウスあたり4クレジットx5倍のサイズ)のコストがかかる可能性があります。

Query Acceleration Serviceを同時に使用するクエリの数に関係なく、コストは同じです。Query Acceleration Serviceは、サービスが使用されている場合にのみ、秒単位で課金されます。これらのクレジットは、ウェアハウスの使用とは別に請求されます。

すべてのクエリが、スケールファクターによって利用可能になるリソースのフルセットを必要とするわけではありません。サービスのためにリクエストされるリソースの量は、アクセラレーションの対象となるクエリの量と、それに応答するために処理されるデータの量によって異なります。スケールファクターの値またはリクエストされたリソースの量に関係なく、クエリアクセラレーションに使用できるコンピューティングリソースの量は、サービスで使用可能なリソースと、他の同時リクエストの数によって制限されます。Query Acceleration Serviceは、必要な数のリソースをクエリの実行時に使用可能な量のみ使用します。

スケールファクターが明示的に設定されていない場合、デフォルト値は 8 です。スケールファクターを 0 に設定すると、上限がなくなり、クエリが必要な数のリソースをリースし、クエリの処理に使用できるようになります。

次の例では、 my_wh という名前のウェアハウスを変更して、最大スケールファクターを0にしたQuery Acceleration Serviceを有効にします。

alter warehouse my_wh set
  ENABLE_QUERY_ACCELERATION = true
  QUERY_ACCELERATION_MAX_SCALE_FACTOR = 0;
Copy

Query Acceleration Serviceの使用状況に対するモニター

ウェブインターフェイスを使用した、Query Accelerationの使用状況に対するモニター

Query Acceleration Serviceを有効にすると、 クエリプロファイルプロファイルの概要 パネルを表示して、クエリアクセラレーションの結果の影響を確認できます。

次のスクリーンショットは、クエリ全体に対して表示される統計の例を示しています。クエリ内の複数の操作が高速化された場合、結果はこのビューに集約されるため、Query Acceleration Serviceによって実行された作業の合計量を確認できます。

../_images/query-acceleration-profile-overview.png

Profile Overview パネルの Query Acceleration セクションには、次の統計が含まれています。

  • サービスによってスキャンされたパーティション --- スキャンするためにQuery Acceleration Serviceにオフロードされたファイルの数。

  • アクセラレーション用に選択されたスキャン --- 高速化されているテーブルスキャンの数。

演算子の詳細(詳細については、 プロファイルの概要/演算子の詳細 を参照)で、演算子をクリックして詳細情報を表示します。次のスクリーンショットは、 TableScan 操作で表示される統計の例を示しています。

../_images/query-acceleration-table-scan.png

TableScan 詳細パネルの Query Acceleration セクションには、次の統計が含まれています。

  • サービスによってスキャンされたパーティション --- スキャンするためにQuery Acceleration Serviceにオフロードされたファイルの数。

Account Usage QUERY_HISTORY ビューを使用したクエリアクセラレーション使用状況のモニター

クエリに対するクエリアクセラレーションの影響を確認するには、 QUERY_HISTORY ビュー で次の列を使用できます。

  • QUERY_ACCELERATION_BYTES_SCANNED

  • QUERY_ACCELERATION_PARTITIONS_SCANNED

  • QUERY_ACCELERATION_UPPER_LIMIT_SCALE_FACTOR

これらの列を使用して、Query Acceleration Serviceのメリットを受けたクエリを識別できます。クエリごとに、Query Acceleration Serviceによってスキャンされたパーティションとバイトの総数を確認することもできます。

これらの各列の説明については、 QUERY_HISTORY ビュー をご参照ください。

たとえば、過去24時間にQuery Acceleration Serviceによってスキャンされたバイト数が最も多いクエリを検索するには、次を実行します。

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE QUERY_ACCELERATION_PARTITIONS_SCANNED > 0
AND start_time >= DATEADD(hour, -24, CURRENT_TIMESTAMP())
ORDER BY QUERY_ACCELERATION_BYTES_SCANNED DESC;
Copy

過去24時間にQuery Acceleration Serviceによってスキャンされたパーティションの数が最も多いクエリを検索するには、次を実行します。

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE QUERY_ACCELERATION_PARTITIONS_SCANNED > 0
AND start_time >= DATEADD(hour, -24, CURRENT_TIMESTAMP())
ORDER BY QUERY_ACCELERATION_PARTITIONS_SCANNED DESC;
Copy

Query Acceleration Serviceのコスト

Query Accelerationは、 サーバーレスコンピューティングリソース を使用して対象となるクエリの一部を実行するため、クレジットを消費します。

Query Accelerationは、使用されたコンピューティングリソースに対して秒単位で支払うという点で、Snowflakeの他のサーバーレス機能と同様に課金されます。Query Acceleration Serviceにより消費されたコンピューティング時間あたりのクレジット量を知る方法については、 Snowflakeサービス利用テーブル の「サーバーレス機能クレジットテーブル」をご参照ください。

従来のコンソール内における請求情報の表示

アカウントでQuery Acceleration Serviceを有効にしている場合、 Classic Console の請求ページには QUERY_ACCELERATION というウェアハウスが含まれ、アカウント内のすべてのウェアハウスでサービスによって使用されるすべてのクレジットが表示されます。

以下のスクリーンショットは、 QUERY_ACCELERATION ウェアハウスに表示される請求情報の例を示しています。

../_images/query-acceleration-billing-ui.png

Account Usage QUERY_ACCELERATION_HISTORY ビューを使用した請求データの表示

Account Usage QUERY_ACCELERATION_HISTORY ビュー で請求データを表示できます。

このクエリは、アカウント内の各ウェアハウスが、Query Acceleration Serviceに使用するクレジットの合計数を返します(月度累計)。

SELECT warehouse_name,
  SUM(credits_used) AS total_credits_used
FROM snowflake.account_usage.query_acceleration_history
WHERE start_time >= DATE_TRUNC(month, CURRENT_DATE)
GROUP BY 1
ORDER BY 2 DESC;
Copy

QUERY_ACCELERATION_HISTORY 関数を使用した請求の表示

Information Schema QUERY_ACCELERATION_HISTORY 関数を使用して請求データを表示することもできます。

次の例では、 QUERY_ACCELERATION_HISTORY 関数を使用して、過去12時間以内にこのサービスによって高速化されたクエリに関する情報を返します。

select * from
table(information_schema.query_acceleration_history(
  date_range_start=>dateadd(H, -12, current_timestamp)));
Copy