教程:使用 Query Acceleration Service 提高工作负载性能

简介

Snowflake 提供多种性能增强功能来加速其各种工作负载。在本教程中,您将学习如何利用 Query Acceleration Service (QAS) 提高您的整体工作负载性能。

先决条件

您将学习的内容

在本教程中,您将学习如何:

  • 在查询历史记录中查找符合加速条件的查询。

  • 在两个独立的仓库中执行查询,以确定查询加速的效果。

  • 比较有加速和没有加速情况下的查询性能和成本。

  • 确定您的哪些仓库将从 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 为“X-Small”且 UPPER_LIMIT_SCALE_FACTOR 为 64。

  2. 复制查询文本、仓库规模和上限比例因子。

创建两个新仓库

本教程需要使用两个仓库来执行查询:一个启用 Query Acceleration Service,另一个不启用。在新的单独仓库中执行相同的查询将允许您比较本教程中 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 的情况下执行该查询以查看其执行情况。

如果您使用提供的示例查询而不是查询历史记录中符合条件的查询,请首先执行以下语句:

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 的仓库,另一次则使用没有启用该功能的仓库。现在,您可以比较查询的查询性能了。

为此,您可以执行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 值与第二个查询中的 credits_used 值相加,计算出 QAS 的总成本。

到目前为止,您已经在两个仓库中测试了查询,其中一个仓库启用了 QAS,另一个则没有启用,并且能够比较 QAS 的性能和成本。接下来,您将学习如何确定哪些仓库将从 QAS 受益最多。

在您的工作负载中查找符合条件的仓库

您可以通过确定具有最多符合加速条件的查询的仓库和/或查询可加速时间最多的仓库,来找到从查询加速中受益最多的仓库。

  • 确定上个月符合 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
  • 确定上个月符合 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

通常,受益最多的仓库具有最多数量的符合条件的查询、最长的符合条件的查询加速时间,或两者兼而有之。例如,如果仓库位于上述两个查询结果的顶部,则该仓库可能是查询加速的良好候选者。

启用 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
语言: 中文