チュートリアル: 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 のメリットを最も受けられるかを識別する方法を学びます。

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

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

  • 直近1か月でQuery Acceleration Serviceの対象となるクエリが最も多いウェアハウスを識別子で確認します。

    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
  • 直近1か月でQuery Acceleration Serviceの対象となる時間が最も長いウェアハウスを識別子で確認します。

    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の有効化

Query Acceleration Serviceのメリットを最も受けるウェアハウスを決定した後、次の ALTER WAREHOUSE ステートメントを実行して、クエリアクセラレーションを有効にします。

ALTER WAREHOUSE <warehouse_name> SET
  enable_query_acceleration = TRUE;
Copy

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

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

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

DROP WAREHOUSE noqas_wh;

DROP WAREHOUSE qas_wh;
Copy