チュートリアル: Query Acceleration Serviceによりワークロードのパフォーマンスを向上させる

概要

Snowflakeは、さまざまなワークロードを加速させるために、各種のパフォーマンス強化機能を提供しています。このチュートリアルでは、Query Acceleration Service(QAS)を活用して、ワークロード全体のパフォーマンスを向上させる方法について学びます。

前提条件

学習内容

このチュートリアルでは、次の方法を学習します。

  • クエリ履歴から、アクセラレーションの対象となるクエリを探します。

  • クエリアクセサレーションの効果を確認するために、2つのウェアハウスでクエリを実行します。

  • アクセラレーションを使用した場合と使用しない場合のクエリのパフォーマンスとコストを比較します。

  • Query Acceleration Serviceのメリットを最も受けられるウェアハウスを識別します。

  • 既存のウェアハウスに対して、サービスを有効にします。

対象となるクエリを探す

加速させる対象となるクエリを探します。以下のクエリ例を使用すると、アクセラレーションの対象となるクエリを検索できます。

このクエリは、 ACCOUNT_USAGE スキーマにある QUERY_ACCELERATION_ELIGIBLE ビューの eligible_query_acceleration_timeフィールドと総クエリ時間の比率によって特定される、対象となる時間比率の高いクエリを識別します。

SELECT query_id, query_text, start_time, end_time, warehouse_name, warehouse_size, eligible_query_acceleration_time, upper_limit_scale_factor, DATEDIFF(second, start_time, end_time) AS total_duration, eligible_query_acceleration_time / NULLIF(DATEDIFF(second, start_time, end_time), 0) AS eligible_time_ratio FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ACCELERATION_ELIGIBLE WHERE start_time >= DATEADD(day, -30, CURRENT_TIMESTAMP()) AND eligible_time_ratio <= 1.0 AND total_duration BETWEEN 3 * 60 and 5 * 60 ORDER BY (eligible_time_ratio, upper_limit_scale_factor) DESC NULLS LAST LIMIT 100; 
Copy
  1. 結果から、 UPPER_LIMIT_SCALE_FACTOR の値が最大のクエリを選択します。

  2. クエリテキスト、ウェアハウスサイズ、上限スケールファクターをコピーします。

上記のクエリで結果が得られない場合でも、以下のクエリ例を使用して、このチュートリアルに従うことができます。このクエリのサンプルデータセットは、共有されているSnowflakeのサンプルデータにある TPC-DS データ のスナップショットです。

SELECT d.d_year as "Year", i.i_brand_id as "Brand ID", i.i_brand as "Brand", SUM(ss_net_profit) as "Profit" FROM snowflake_sample_data.tpcds_sf10tcl.date_dim d, snowflake_sample_data.tpcds_sf10tcl.store_sales s, snowflake_sample_data.tpcds_sf10tcl.item i WHERE d.d_date_sk = s.ss_sold_date_sk AND s.ss_item_sk = i.i_item_sk AND i.i_manufact_id = 939 AND d.d_moy = 12 GROUP BY d.d_year, i.i_brand, i.i_brand_id ORDER BY 1, 4, 2 LIMIT 200; 
Copy
  1. このクエリ例を使用する場合、 WAREHOUSE_SIZE はXS、 UPPER_LIMIT_SCALE_FACTOR は64です。

  2. クエリテキスト、ウェアハウスサイズ、上限スケールファクターをコピーします。

新しいウェアハウスを作成する

このチュートリアルでは、クエリを実行するために、Query Acceleration Serviceを有効にしたウェアハウスと、有効にしていないウェアハウスの2つが必要です。同じクエリを新たに別のウェアハウスで実行することで、このチュートリアルのQuery Acceleration Serviceのパフォーマンスとコストの両方を比較できます。

ウェアハウスを作成するには、Snowflakeに接続し、 Snowsight または SnowSQL を使用して以下のコマンドを実行します。 warehouse_sizeupper_limit_scale_factor を前のステップで選択した値に置き換えます。

CREATE WAREHOUSE noqas_wh WITH WAREHOUSE_SIZE='<warehouse_size>' ENABLE_QUERY_ACCELERATION = false INITIALLY_SUSPENDED = true AUTO_SUSPEND = 60; CREATE WAREHOUSE qas_wh WITH WAREHOUSE_SIZE='<warehouse_size>' ENABLE_QUERY_ACCELERATION = true QUERY_ACCELERATION_MAX_SCALE_FACTOR = <upper_limit_scale_factor> INITIALLY_SUSPENDED = true AUTO_SUSPEND = 60; 
Copy

QAS を使用しないクエリ

環境を設定し、Query Acceleration Serviceの対象となるクエリを見つけたら、Query Acceleration Serviceを有効にせずにクエリを実行し、そのパフォーマンスを確認します。

クエリ履歴から対象となるクエリではなく、プロバイダーが提供するサンプルクエリを使用する場合は、まず以下のステートメントを実行します。

USE SCHEMA snowflake_sample_data.tpcds_sf10tcl; 
Copy

ウェアハウスを選択し、クエリを実行します。

  1. QAS が有効になっていないウェアハウスを使用します。

    USE WAREHOUSE noqas_wh; 
    Copy
  2. テストクエリ(前のステップからのクエリテキスト)を実行します。

  3. 最後に実行されたクエリのクエリ ID を取得します。

    Snowsight を使用している場合は、 Results パネルにある Query Profile パネルからクエリ ID をコピーして貼り付けることができます。または、次のステートメントを実行することもできます。

    SELECT LAST_QUERY_ID(); 
    Copy
  4. 今後の追加ステップのために、このクエリ ID をコピーします。

QAS を使用するクエリ

クエリアクセラレーションを使用しないウェアハウスでクエリを実行した後、 QAS が有効なウェアハウスで同じクエリを実行します。

  1. QAS を有効にしたウェアハウスを使用して、クエリを実行します。

    USE WAREHOUSE qas_wh; 
    Copy
  2. テストクエリ(前のステップからのクエリテキスト)を実行します。

  3. 最後に実行されたクエリのクエリ ID を取得します

    Snowsight を使用している場合は、 Results パネルにある Query Profile パネルからクエリ ID をコピーして貼り付けることができます。または、次のステートメントを実行することもできます。

    SELECT LAST_QUERY_ID(); 
    Copy
  4. 今後の追加ステップのために、このクエリ ID をコピーします。

クエリのパフォーマンスとコストを比較する

前のステップでは、 QAS が有効なウェアハウスと有効ではないウェアハウスを使用して、同じクエリを2回実行しました。これで、クエリのパフォーマンスを比較できます。

それには、Information Schema QUERY_HISTORY テーブル関数を実行し、そのクエリ IDs を使ったクエリの実行時間を比較します。

SELECT query_id, query_text, warehouse_name, total_elapsed_time FROM TABLE(snowflake.information_schema.query_history()) WHERE query_id IN ('<non_accelerated_query_id>', '<accelerated_query_id>') ORDER BY start_time; 
Copy

同じクエリをアクセラレーションあり、なしで実行した場合の TOTAL_ELAPSED_TIME を比較します。

次に、各ウェアハウスのコストを比較するために、各ウェアハウスのInformation Schema WAREHOUSE_METERING_HISTORY テーブル関数を実行します。

注釈

このチュートリアルで新しいウェアハウスの作成をスキップし、既存のウェアハウスを使用した場合、このテーブル関数の結果は役に立たない可能性が高くなります。

  1. 次のクエリを実行し、 noqas_wh ウェアハウスのコストを表示します。

    SELECT start_time, end_time, warehouse_name, credits_used, credits_used_compute, credits_used_cloud_services, (credits_used + credits_used_compute + credits_used_cloud_services) AS credits_used_total FROM TABLE(SNOWFLAKE.INFORMATION_SCHEMA.WAREHOUSE_METERING_HISTORY( DATE_RANGE_START => DATEADD('days', -1, CURRENT_DATE()), WAREHOUSE_NAME => 'NOQAS_WH' )); 
    Copy
  2. QAS を有効にしたウェアハウスのために、ウェアハウスとQuery Acceleration Serviceのコストを加算して、 QAS の総コストを算出します。

    • qas_wh ウェアハウスのコストを表示します。

      SELECT start_time, end_time, warehouse_name, credits_used, credits_used_compute, credits_used_cloud_services, (credits_used + credits_used_compute + credits_used_cloud_services) AS credits_used_total FROM TABLE(SNOWFLAKE.INFORMATION_SCHEMA.WAREHOUSE_METERING_HISTORY( DATE_RANGE_START => DATEADD('days', -1, CURRENT_DATE()), WAREHOUSE_NAME => 'QAS_WH' )); 
      Copy
    • Information Schema QUERY_ACCELERATION_HISTORY テーブル関数でQuery Acceleration Serviceのコストを表示します。

       SELECT start_time, end_time, warehouse_name, credits_used, num_files_scanned, num_bytes_scanned FROM TABLE(SNOWFLAKE.INFORMATION_SCHEMA.QUERY_ACCELERATION_HISTORY( DATE_RANGE_START => DATEADD('days', -1, CURRENT_DATE()), WAREHOUSE_NAME => 'QAS_WH' )); 
      Copy

    最初のクエリの credits_used_total 値と2番目のクエリの credits_used 値を加算し、 QAS の総コストを算出します。

これまでに、 QAS が有効なウェアハウスと有効ではないウェアハウスのそれぞれでクエリをテストし、 QAS のパフォーマンスとコストを比較することができました。次に、どのウェアハウスが QAS のメリットを最も受けられるかを識別する方法を学びます。

ワークロードの中から対象となるウェアハウスを探す

クエリアクセラレーションのメリットを最も受けられるウェアハウスは、アクセラレーションの対象となるクエリの数が最も多いウェアハウスと、クエリアクセラレーションの対象となる時間が最も長いウェアハウスを決定することによって見つけられます。

  • query_id の値をカウントすることで、直近1ヶ月でクエリ加速サービスの対象となるクエリが最も多かったウェアハウスを特定します。

    SELECT warehouse_name, COUNT(query_id) as num_eligible_queries, MAX(upper_limit_scale_factor) FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ACCELERATION_ELIGIBLE WHERE start_time > DATEADD(month, -1, CURRENT_TIMESTAMP()) GROUP BY warehouse_name ORDER BY num_eligible_queries DESC; 
    Copy
  • eligible_query_acceleration_time の値を合計することで、直近1ヶ月でクエリ加速サービスの対象時間が最も長かったウェアハウスを特定します。

    SELECT warehouse_name, SUM(eligible_query_acceleration_time) AS total_eligible_time, MAX(upper_limit_scale_factor) FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ACCELERATION_ELIGIBLE WHERE start_time > DATEADD(month, -1, CURRENT_TIMESTAMP()) GROUP BY warehouse_name ORDER BY total_eligible_time DESC; 
    Copy

通常、最も恩恵を受けるウェアハウスは、対象となるクエリの数が最も多い、対象となるクエリのアクセラレーション時間が最も長い、またはその2つの組み合わせのいずれかです。たとえば、あるウェアハウスが上記の両方のクエリで結果の上位にある場合、そのウェアハウスはクエリアクセラレーションの良い候補になる可能性があります。

Query Accelerationの有効化

クエリ・アクセラレーション・サービスを最も活用できるウェアハウスが決まったら、次の ALTER WAREHOUSE ステートメントを実行して、クエリ・アクセラレーションを有効にします。

ALTER WAREHOUSE <warehouse_name> SET ENABLE_QUERY_ACCELERATION = TRUE; 
Copy

ウェアハウスで QAS を有効にすると、対象となるクエリのクエリ アクセラレーションを利用する準備が整います。

クリーンアップと追加のリソース

クリーンアップするには、このチュートリアルのために作成したウェアハウスをドロップします。

DROP WAREHOUSE noqas_wh; DROP WAREHOUSE qas_wh; 
Copy