我喜欢
SHOW TABLES
查询如何返回列出的每个表的行和字节,但不幸的是,SHOW SCHEMAS
查询并非如此。
获取模式列表的总字节大小的最佳方法是什么?
我已经通过查询成功做到了这一点
information_schema.tables
:
SELECT
table_schema AS schema,
SUM(bytes) AS bytes
FROM information_schema.tables
GROUP BY schema;
请注意,这仅适用于当前数据库,因为每个数据库都有自己的
information_schema
。因此,这无法获取数据库列表的大小。但是,可以单独获取每个数据库的总大小:
SELECT SUM(bytes) AS bytes
FROM [database_name].information_schema.tables;
对此的一个很好的补充是使用 UDF 很好地格式化字节大小,如
nicebytes
示例here,在查询中产生 nicebytes(SUM(bytes)) AS bytes
。
编辑: 其中许多查询可以联合起来,以便一次获取多个数据库/模式的结果。它们还可以每天运行并将结果存储到另一个表中,这提供了一种监视数据库和模式随时间变化的大小的好方法:
SELECT
table_catalog AS database,
table_schema AS schema,
SUM(bytes) AS bytes
FROM database_1.information_schema.tables
GROUP BY database, schema
UNION ALL
SELECT
table_catalog AS database,
table_schema AS schema,
SUM(bytes) AS bytes
FROM database_2.information_schema.tables
GROUP BY database, schema;
编辑 2: 现在(2024 年)存储过程可以返回表,因此上面的查询现在可以动态生成,而不是从数据库列表中硬编码。 这篇 Medium 文章 给出了如何做到这一点的示例。
如果您拥有帐户管理员访问权限或已被授予访问帐户使用情况视图的权限,您可以尝试使用 TABLE_STORAGE_METRICS。
select
TABLE_CATALOG,
TABLE_SCHEMA,
nicebytes(sum(ACTIVE_BYTES)) ACTIVE_STORAGE,
nicebytes(sum(TIME_TRAVEL_BYTES)) TIME_TRAVEL_STORAGE,
nicebytes(sum(FAILSAFE_BYTES)) FAILSAFE_STORAGE
from SNOWFLAKE.ACCOUNT_USAGE.TABLE_STORAGE_METRICS
where TABLE_DROPPED IS NULL
and SCHEMA_DROPPED IS NULL
and CATALOG_DROPPED IS NULL
group by 1,2
order by 1,2,3
这也利用了 nicebytes UDF