监控混合表工作负载

利用混合表的 Unistore 工作负载将与在 Snowflake 中运行的许多分析工作负载不同。例如,您的工作负载可能包含较少的唯一查询,这些查询运行所需时间更少、执行频率更高。您可以通过多种可选方式来监控工作负载。

监控事务

混合表支持 Snowflake 事务监控功能,包括 SHOW TRANSACTIONSDESCRIBE TRANSACTIONSHOW LOCKSLOCK WAIT HISTORY

混合表的这些命令和视图的行为与标准 Snowflake 表的行为一致,但以下更改除外:

  • SHOW LOCKS 命令中引入了一种新的 ROW 锁类型,用于表示针对混合表的行锁。这些锁会被汇总,以显示一个事务持有(一个或多个)行锁,而另一个事务正在等待这些锁。

  • LOCK WAIT HISTORY 不显示架构相关信息。

  • LOCK_WAIT_HISTORY 不会汇总 BLOCKER_QUERIES。如果查询被多个阻塞者阻塞,则这些阻塞者将在视图中显示为多个记录,而不是在单个等待者记录的 BLOCKER_QUERIES JSON 数组中显示为多个条目。

  • 对于 SHOW LOCKS 的结果和 LOCK_WAIT_HISTORY 视图:

    • 在汇总行锁时,假定持有锁的事务在启动时获取锁。

    • 由于 Unistore 事务量可能很大,因此仅显示长时间(约 5 秒)阻塞其他事务的锁。

    • 等待锁的事务即使已经获取了锁(不超过 1 分钟),可能看起来仍在等待锁。锁报告的准确性将在将来的版本中得到提高。

    • 如果阻塞等待中的查询的语句已完成,并且是对混合表的短期运行查询,则阻塞者查询的以下信息不会显示在等待中的查询记录的 BLOCKER_QUERY 字段内:

      • 阻塞者查询的查询 UUID

      • 阻塞者查询的会话 ID

      • 阻塞者查询的用户名

      • 阻塞者查询的数据库 ID

      • 阻塞者查询的数据库名称

监控工作负载

To monitor your operational workloads effectively, use the AGGREGATE_QUERY_HISTORY 视图. This view enables you to monitor the health of your workload, diagnose issues, and identify avenues for optimization. The AGGREGATE_QUERY_HISTORY view aggregates query execution statistics for a repeated parameterized query over a time interval so that it is easier and more efficient to identify patterns in your workloads and queries over time. Note that all Snowflake workloads and queries will be combined in the output of this view.

AGGREGATE_QUERY_HISTORY 视图可帮助您回答以下有关工作负载的问题:

  • 我的虚拟仓库每秒执行多少次操作?

  • 在我的工作负载中,哪些查询消耗的总时间或资源量最多?

  • 随着时间的推移,特定查询的性能是否发生了重大变化?

为了帮助提高工作负载的性能和效率,低延迟操作的个别执行(不到一秒)将不会存储在 QUERY_HISTORY 视图 中,也不会生成唯一的查询配置文件。相反,该查询的重复执行的汇总统计信息将在 AGGREGATE_QUERY_HISTORY 视图中返回。您还可以查看选定时间间隔内,该查询的抽样查询配置文件。有关此行为的更多信息,请参阅 使用说明

小技巧

您可以使用 Snowsight 中的 分组查询历史记录视图 来可视化典型混合表工作负载的性能和统计信息。此视图并不捕获所有混合表活动,但它为监控大量在一定程度上重复且运行速度极快的单个查询的性能提供了很好的替代方案。

监控整体工作负载运行状况

使用 AGGREGATE_QUERY_HISTORY 视图,以监控整体工作负载吞吐量和并发性,并调查工作负载中的意外峰值或低谷。例如:

SELECT
    interval_start_time
    , SUM(calls) as execution_count
    , SUM(calls) / 60 as queries_per_second
    , COUNT(DISTINCT session_id) as unique_sessions
    , COUNT(user_name) as unique_users
FROM snowflake.account_usage.aggregate_query_history
WHERE warehouse_name = '<MY_WAREHOUSE>'
  AND interval_start_time > $START_DATE
  AND interval_start_time < $END_DATE
GROUP BY ALL;
Copy

您还可以使用汇总查询历史记录来监控错误、排队、锁定阻塞或限制等潜在问题。例如:

WITH time_issues AS
(
    SELECT
        interval_start_time
        , SUM(transaction_blocked_time:"SUM") as transaction_blocked_time
        , SUM(queued_provisioning_time:"SUM") as queued_provisioning_time
        , SUM(queued_repair_time:"SUM") as queued_repair_time
        , SUM(queued_overload_time:"SUM") as queued_overload_time
        , SUM(hybrid_table_requests_throttled_count) as hybrid_table_requests_throttled_count
    FROM snowflake.account_usage.aggregate_query_history
    WHERE WAREHOUSE_NAME = '<MY_WAREHOUSE>'
      AND interval_start_time > $START_DATE
      AND interval_start_time < $END_DATE
    GROUP BY ALL
),
errors AS
(
    SELECT
        interval_start_time
        , SUM(value:"count") as error_count
    FROM
    (
        SELECT
            a.interval_start_time
            ,e.*
        FROM
            snowflake.account_usage.aggregate_query_history a,
            TABLE(flatten(input => errors)) e
        WHERE interval_start_time > $START_DATE
          AND interval_start_time < $END_DATE
  )
  GROUP BY ALL
)
    SELECT
        ts.interval_start_time
        , error_count
        , transaction_blocked_time
        , queued_provisioning_time
        , queued_repair_time
        , queued_overload_time
        , hybrid_table_requests_throttled_count
    FROM time_issues ts
    FULL JOIN errors e ON e.interval_start_time = ts.interval_start_time
;
Copy

此类指标通常应保持在较低水平。如果看到意外峰值,建议您调查原因。

确定和调查重复查询

您可以选择优化或调查常见查询和频繁执行的查询的性能,以提高工作负载的效率。使用 AGGREGATE_QUERY_HISTORY 视图,按执行计数确定一个工作负载的热门查询。例如:

SELECT
    query_parameterized_hash
    , any_value(query_text)
    , SUM(calls) as execution_count
FROM snowflake.account_usage.aggregate_query_history
WHERE TRUE
          AND warehouse_name = '<MY_WAREHOUSE>'
          AND interval_start_time > '2024-02-01'
          AND interval_start_time < '2024-02-08'
GROUP BY
          query_parameterized_hash
ORDER BY execution_count DESC
;
Copy

您可以选择查看速度最慢的查询的指标。例如:

SELECT
    query_parameterized_hash
    , any_value(query_text)
    , SUM(total_elapsed_time:"sum"::NUMBER) / SUM (calls) as avg_latency
FROM snowflake.account_usage.aggregate_query_history
WHERE TRUE
          AND warehouse_name = '<MY_WAREHOUSE>'
          AND interval_start_time > '2024-02-01'
          AND interval_start_time < '2024-02-08'
GROUP BY
          query_parameterized_hash
ORDER BY avg_latency DESC
;
Copy

您可以分析特定查询在一段时间内的性能,以深入了解延迟趋势。例如:

SELECT
    interval_start_time
    , total_elapsed_time:"avg"::number avg_elapsed_time
    , total_elapsed_time:"min"::number min_elapsed_time
    , total_elapsed_time:"p90"::number p90_elapsed_time
    , total_elapsed_time:"p99"::number p99_elapsed_time
    , total_elapsed_time:"max"::number max_elapsed_time
FROM snowflake.account_usage.aggregate_query_history
WHERE TRUE
          AND query_parameterized_hash = '<123456>'
          AND interval_start_time > '2024-02-01'
          AND interval_start_time < '2024-02-08'
ORDER BY interval_start_time DESC
;
Copy

此查询计算总查询时间。您还可以修改查询,以在查询的不同阶段(编译、执行、排队和锁定等待)返回更精细的指标。将返回每个阶段的汇总统计信息。

语言: 中文