如何按表/库维度拆分Snowflake STORAGE_USAGE视图的历史存储用量明细
可行实现方案
方案1:账户/数据库级历史时间旅行存储查询
如果不需要下钻到Schema、表维度,可直接使用Snowflake原生视图查询拆分后的存储数据,无需额外开发:
- 可直接调用
SNOWFLAKE.ACCOUNT_USAGE.DATABASE_STORAGE_USAGE_HISTORY视图,该视图自带每日粒度的各数据库存储拆分统计,包含ACTIVE_BYTES、TIME_TRAVEL_BYTES、FAILSAFE_BYTES三个独立指标,可直接统计不同时间周期的用量。
查询示例(统计最近30天各数据库日均时间旅行存储用量):
SELECT DATABASE_NAME, AVG(TIME_TRAVEL_BYTES) AS AVG_DAILY_TIME_TRAVEL_BYTES FROM SNOWFLAKE.ACCOUNT_USAGE.DATABASE_STORAGE_USAGE_HISTORY WHERE USAGE_DATE >= DATEADD('day', -30, CURRENT_DATE()) GROUP BY DATABASE_NAME ORDER BY AVG_DAILY_TIME_TRAVEL_BYTES DESC;
方案2:全维度(表/Schema/数据库)历史时序数据自定义实现
如果需要下钻到表、Schema维度的历史数据,可通过定时快照的方式实现,这是目前唯一支持表级历史时间旅行存储统计的可行方案,核心逻辑是定时留存SNOWFLAKE.ACCOUNT_USAGE.TABLE_STORAGE_METRICS视图的当前数据,生成可回溯的时序表。
具体实现步骤:
- 步骤1:创建历史存储快照表,用于存储每日的表级存储指标
CREATE OR REPLACE TABLE YOUR_ADMIN_DB.YOUR_ADMIN_SCHEMA.TABLE_STORAGE_HISTORY ( SNAPSHOT_DATE DATE NOT NULL, DATABASE_NAME VARCHAR, SCHEMA_NAME VARCHAR, TABLE_NAME VARCHAR, TABLE_ID NUMBER, ACTIVE_BYTES NUMBER, TIME_TRAVEL_BYTES NUMBER, FAILSAFE_BYTES NUMBER, TOTAL_STORAGE_BYTES NUMBER AS (ACTIVE_BYTES + TIME_TRAVEL_BYTES + FAILSAFE_BYTES) ) COMMENT = '每日快照留存的表级存储用量历史数据';
- 步骤2:创建定时快照任务,每日自动拉取最新表级存储数据
CREATE OR REPLACE TASK YOUR_ADMIN_DB.YOUR_ADMIN_SCHEMA.TASK_SNAPSHOT_TABLE_STORAGE WAREHOUSE = YOUR_ADMIN_WH SCHEDULE = 'USING CRON 0 1 * * * UTC' -- 可根据需要调整调度时间,此处为每日UTC时间1点执行 AS INSERT INTO YOUR_ADMIN_DB.YOUR_ADMIN_SCHEMA.TABLE_STORAGE_HISTORY ( SNAPSHOT_DATE, DATABASE_NAME, SCHEMA_NAME, TABLE_NAME, TABLE_ID, ACTIVE_BYTES, TIME_TRAVEL_BYTES, FAILSAFE_BYTES ) SELECT CURRENT_DATE() - 1 AS SNAPSHOT_DATE, -- 统计前一天的存储情况 TABLE_CATALOG AS DATABASE_NAME, TABLE_SCHEMA AS SCHEMA_NAME, TABLE_NAME, TABLE_ID, ACTIVE_BYTES, TIME_TRAVEL_BYTES, FAILSAFE_BYTES FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_STORAGE_METRICS WHERE DELETED = FALSE; -- 过滤已删除的表
- 步骤3:启用定时任务(需要任务所属角色拥有
EXECUTE TASK权限)
ALTER TASK YOUR_ADMIN_DB.YOUR_ADMIN_SCHEMA.TASK_SNAPSHOT_TABLE_STORAGE RESUME;
使用示例(按表统计最近90天的峰值时间旅行存储用量):
SELECT DATABASE_NAME, SCHEMA_NAME, TABLE_NAME, MAX(TIME_TRAVEL_BYTES) AS PEAK_TIME_TRAVEL_BYTES FROM YOUR_ADMIN_DB.YOUR_ADMIN_SCHEMA.TABLE_STORAGE_HISTORY WHERE SNAPSHOT_DATE >= DATEADD('day', -90, CURRENT_DATE()) GROUP BY DATABASE_NAME, SCHEMA_NAME, TABLE_NAME ORDER BY PEAK_TIME_TRAVEL_BYTES DESC;
若需要补入任务创建之前的历史数据,可通过
TABLE_STORAGE_METRICS的时间旅行功能回查过往数据,只要回查时间在你账户的时间旅行保留期内即可,示例补入7天前的历史数据:
INSERT INTO YOUR_ADMIN_DB.YOUR_ADMIN_SCHEMA.TABLE_STORAGE_HISTORY ( SNAPSHOT_DATE, DATABASE_NAME, SCHEMA_NAME, TABLE_NAME, TABLE_ID, ACTIVE_BYTES, TIME_TRAVEL_BYTES, FAILSAFE_BYTES ) SELECT DATEADD('day', -7, CURRENT_DATE()) AS SNAPSHOT_DATE, TABLE_CATALOG AS DATABASE_NAME, TABLE_SCHEMA AS SCHEMA_NAME, TABLE_NAME, TABLE_ID, ACTIVE_BYTES, TIME_TRAVEL_BYTES, FAILSAFE_BYTES FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_STORAGE_METRICS AT(OFFSET => -60*60*24*7) -- 回查7天前的视图数据,调整参数可补入其他日期数据 WHERE DELETED = FALSE;
内容的提问来源于stack exchange,提问作者Connor Lough
相关产品推荐
相关产品推荐

