如何统计多集群仓库随时间变化的活跃集群数量
解决方案:利用WAREHOUSE_CLUSTER_HISTORY统计多集群运行数量
要准确生成多集群仓库随时间变化的运行集群数图表,你需要使用SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_CLUSTER_HISTORY视图——它专门记录每个集群的启动、结束时间及归属仓库信息,完美匹配你的需求。你的原代码问题在于误用了WAREHOUSE_EVENTS_HISTORY,该视图仅记录仓库级事件,无法区分单个集群的运行状态。
修正后的SQL代码
-- 生成连续时间序列(示例为12小时内的每分钟间隔,可按需调整) WITH time_series AS ( SELECT DATEADD(MINUTE, seq4(), DATEADD(H, -12, CURRENT_TIMESTAMP())) AS interval_time FROM TABLE(GENERATOR(ROWCOUNT => 720)) -- 12小时×60分钟=720个时间点 ), -- 提取目标仓库的集群运行时段 cluster_runs AS ( SELECT warehouse_id, cluster_number, start_time, -- 把未结束的集群结束时间设为当前时间,确保正在运行的集群被统计 COALESCE(end_time, CURRENT_TIMESTAMP()) AS end_time FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_CLUSTER_HISTORY WHERE warehouse_name = 'COMPUTE_WH' AND start_time >= DATEADD(H, -12, CURRENT_TIMESTAMP()) ) -- 计算每个时间点的运行集群数 SELECT ts.interval_time AS timestamp, COUNT(DISTINCT cr.cluster_number) AS running_clusters FROM time_series ts LEFT JOIN cluster_runs cr ON ts.interval_time BETWEEN cr.start_time AND cr.end_time GROUP BY ts.interval_time ORDER BY ts.interval_time;
代码说明
- 时间序列生成:通过
GENERATOR函数创建指定时间范围内的连续时间点,保证每个时刻的集群状态都能被捕捉到。 - 集群状态处理:用
COALESCE处理未结束的集群(end_time为空),将其结束时间设为当前时间,避免遗漏正在运行的集群。 - 关联统计:通过时间范围关联,统计每个时间点处于运行状态的集群数量,
COUNT(DISTINCT cluster_number)确保每个集群仅被计数一次。
可选调整
- 若需要更粗的时间粒度(比如15分钟),可将
DATEADD(MINUTE, seq4(), ...)改为DATEADD(MINUTE, seq4()*15, ...),同时将ROWCOUNT调整为12*4=48。 - 如需统计所有仓库,去掉
WHERE warehouse_name = 'COMPUTE_WH',并在GROUP BY中加入warehouse_name字段。
内容的提问来源于stack exchange,提问作者Noway
相关产品推荐
相关产品推荐

