探索执行时间¶
本主题说明如何检查查询和 任务 过去的性能。此信息有助于确定性能优化的候选方案,并允许您查看优化策略是否具有预期效果。
您可以使用 Snowsight 或通过针对 ACCOUNT_USAGE 架构中的视图编写查询来探索历史性能。无权访问 ACCOUNT_USAGE 架构的用户可以使用 Information Schema 查询类似的数据。
查看执行时间和负载¶
您可以使用 Snowsight 直观地了解查询和任务的性能以及仓库的负载。
- 查询:
登录 Snowsight。
选择 Monitoring » Query History。
使用 Duration 列了解执行查询所花费的时间。您可以对列进行排序以查找运行时间最长的查询。
如果要重点关注特定用户的查询,请使用 User 下拉列表选择该用户。
如果要重点关注在特定仓库上运行的查询,请选择 Filters » Warehouse,然后选择该仓库。
- 仓库:
登录 Snowsight。
切换到具有仓库权限的角色。
选择 Admin » Warehouses。
选择仓库。
使用 Warehouse Activity 图表可视化仓库的负载,包括查询是否排队。
- 任务:
登录 Snowsight。
选择 Monitoring » Task History 以查看执行任务的 SQL 代码所用的时间。
深入了解执行时间¶
查询配置文件 允许您检查查询的哪些部分执行时间最长。其中包括一个 Most Expensive Nodes 窗格,用于标识执行时间最长的运算符节点。通过查看节点在特定类别的查询处理中花费的执行时间的百分比,可以进一步向下钻取。
要访问查询的查询配置文件,请执行以下操作:
登录 Snowsight。
选择 Monitoring » Query History。
选择查询的查询 ID。
选择 Query Profile 选项卡。
小技巧
您可以通过执行 GET_QUERY_OPERATOR_STATS 函数以编程方式访问查询配置文件的性能统计信息。
编写查询以探索执行时间¶
Account Usage 架构包含与查询和任务的执行时间相关的视图。还包含与仓库在执行查询时的负载相关的视图。您可以针对这些视图编写查询,以深入了解性能数据并创建自定义报表和仪表板。
默认情况下,只有账户管理员(即具有 ACCOUNTADMIN 角色的用户)才能访问 ACCOUNT_USAGE 架构中的视图。要允许其他用户访问这些视图,请参阅 为其他角色启用 SNOWFLAKE 数据库使用。
无权访问 ACCOUNT_USAGE 架构的用户(例如运行查询的用户或仓库管理员)仍然可以使用 Information Schema 的 QUERY_HISTORY 表函数 返回最近的执行时间和其他查询元数据。
请注意, ACCOUNT_USAGE 视图不会在运行查询或任务后立即更新。如果要在运行后立即检查查询的执行时间,请使用 Snowsight 查看其性能。Information Schema 的更新速度也比 ACCOUNT_USAGE 视图快。
ACCOUNT_USAGE 视图 |
描述 |
延迟 |
---|---|---|
用于分析最近 365 天(1 年)内各个维度(时间范围、执行时间、会话、用户、仓库等)的 Snowflake 查询历史记录。 |
长达 45 分钟 |
|
用于分析指定日期范围内仓库上的工作负载。 |
长达 3 小时 |
|
用于检索过去 365 天(1 年)内的任务使用历史记录。 |
长达 45 分钟 |
示例查询¶
针对 ACCOUNT_USAGE 架构的以下查询提供了对查询、仓库和任务的过去性能的深入了解。点击查询的名称可查看完整 SQL 示例。
- 查询性能:
- 仓库负载:
- 任务性能:
查询性能¶
查询:运行时间最长的前 n 个查询¶
此查询提供最后一天运行时间最长的前 n(以下示例中为 50)的查询列表。您可以调整 DATEADD
函数以专注于更短或更长的时间段。用仓库的名称替换 my_warehouse
。
SELECT query_id,
ROW_NUMBER() OVER(ORDER BY partitions_scanned DESC) AS query_id_int,
query_text,
total_elapsed_time/1000 AS query_execution_time_seconds,
partitions_scanned,
partitions_total,
FROM snowflake.account_usage.query_history Q
WHERE warehouse_name = 'my_warehouse' AND TO_DATE(Q.start_time) > DATEADD(day,-1,TO_DATE(CURRENT_TIMESTAMP()))
AND total_elapsed_time > 0 --only get queries that actually used compute
AND error_code IS NULL
AND partitions_scanned IS NOT NULL
ORDER BY total_elapsed_time desc
LIMIT 50;
查询:过去一个月按执行时间组织的查询¶
此查询按桶对给定仓库的查询进行分组,以了解上个月的执行时间。查询完成时间的这些趋势有助于为调整仓库大小或将某些查询分离到另一个仓库的决策提供信息。用仓库的名称替换 MY_WAREHOUSE
。
SELECT
CASE
WHEN Q.total_elapsed_time <= 60000 THEN 'Less than 60 seconds'
WHEN Q.total_elapsed_time <= 300000 THEN '60 seconds to 5 minutes'
WHEN Q.total_elapsed_time <= 1800000 THEN '5 minutes to 30 minutes'
ELSE 'more than 30 minutes'
END AS BUCKETS,
COUNT(query_id) AS number_of_queries
FROM snowflake.account_usage.query_history Q
WHERE TO_DATE(Q.START_TIME) > DATEADD(month,-1,TO_DATE(CURRENT_TIMESTAMP()))
AND total_elapsed_time > 0
AND warehouse_name = 'my_warehouse'
GROUP BY 1;
查询:查找长时间运行的重复查询¶
您可以使用 查询哈希 (ACCOUNT_USAGE QUERY_HISTORY 视图中 query_hash
列的值)来查找可能不明显的查询性能模式。例如,尽管查询在单次执行期间的开销可能不会过高,但频繁重复执行的查询可能会导致高成本,具体取决于查询运行次数。
您可以使用查询哈希来标识应首先重点优化的查询。例如,以下查询使用 query_hash
列中的值来标识 100 个运行时间最长的查询的查询 IDs :
SELECT
query_hash,
COUNT(*),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE warehouse_name = 'MY_WAREHOUSE'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 7
GROUP BY query_hash
ORDER BY SUM(total_elapsed_time) DESC
LIMIT 100;
查询:跟踪查询随时间推移的平均性能¶
以下语句计算具有特定参数化查询哈希 (cbd58379a88c37ed6cc0ecfebb053b03
) 的所有查询的日平均总运行时间。
SELECT
DATE_TRUNC('day', start_time),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE query_parameterized_hash = 'cbd58379a88c37ed6cc0ecfebb053b03'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 30
GROUP BY DATE_TRUNC('day', start_time);
仓库负载¶
查询:仓库负载总量¶
此查询提供对已执行查询和排队查询的仓库总负载的见解。这些负载值表示时间间隔内处于特定状态的所有查询的总执行时间(以秒为单位)与该时间间隔的总时间(以秒为单位)的比率。
例如,如果 276 秒是 5 分钟(300 秒)间隔内 4 个查询的总时间,则查询负载值为 276/300 = 0.92。
SELECT TO_DATE(start_time) AS date,
warehouse_name,
SUM(avg_running) AS sum_running,
SUM(avg_queued_load) AS sum_queued
FROM snowflake.account_usage.warehouse_load_history
WHERE TO_DATE(start_time) >= DATEADD(month,-1,CURRENT_TIMESTAMP())
GROUP BY 1,2
HAVING SUM(avg_queued_load) >0;
任务性能¶
查询:运行时间最长的任务¶
此查询列出了前一天运行时间最长的任务,这可能表明有机会优化该任务正在执行的 SQL。
SELECT DATEDIFF(seconds, query_start_time,completed_time) AS duration_seconds,*
FROM snowflake.account_usage.task_history
WHERE state = 'SUCCEEDED'
AND query_start_time >= DATEADD (day, -1, CURRENT_TIMESTAMP())
ORDER BY duration_seconds DESC;