Snowflake查询指定Schema零记录表及表存储大小相关问题咨询
Snowflake查询问题解答
空表查询SQL逻辑解释
你提供的空表查询语句前三行逻辑逐行说明如下:
- 第一行
select t.table_schema || '.' || t.table_name as "table_name"
拼接表所属的schema名和表名,中间用.分隔,输出格式为schema名.表名,并给该输出列指定别名table_name;双引号用于保留别名的大小写,避免Snowflake默认将标识符转为大写。 - 第二行
from information_schema.tables t
指定查询的数据源为当前数据库自带的系统元数据视图INFORMATION_SCHEMA.TABLES,并给该视图起别名t简化后续代码编写,该视图存储了当前库下所有表、视图等表对象的元数据信息。如果你需要限定只查
abcschema下的表,需要在where条件中补充t.table_schema = 'ABC'(注意schema名大小写匹配)。 - 第三行
where t.table_type = 'BASE TABLE'
过滤查询结果,只保留基础物理表,排除视图、临时表、外部表等其他类型的表对象。
补充说明:该视图中row_count是元数据统计的近似值,若需要完全精确的空表结果,可对查询返回的表单独执行SELECT COUNT(*)校验。
存储查询返回空记录的原因与解决方案
核心问题原因
你写的查询语句引用的视图位置错误:TABLE_STORAGE_METRICS视图不属于任意数据库的INFORMATION_SCHEMA,而是存放在Snowflake内置的SNOWFLAKE数据库的ACCOUNT_USAGE schema下,所以你查询INFORMATION_SCHEMA.table_storage_metrics找不到对应视图,返回空结果。
解决方案
方案1:使用ACCOUNT_USAGE视图查询全账号存储数据
该视图可以查询整个账号下所有表的存储明细,首先需要管理员给你的角色开通权限:
GRANT MONITOR USAGE ON ACCOUNT TO ROLE <你当前使用的角色名>;
权限开通后执行如下查询即可:
SELECT table_catalog, table_schema, table_name, active_bytes / 1024 / 1024 AS storage_usage_MB -- 除以1024*1024得到MB单位,若需要KB可只除以1024 FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_STORAGE_METRICS WHERE TABLE_CATALOG = 'TEST_DB' AND DELETED IS NULL; -- 过滤已经删除的表
方案2:使用当前库INFORMATION_SCHEMA查询(无需额外权限)
如果你只需要查询TEST_DB下的表存储,可直接使用该库INFORMATION_SCHEMA.TABLES自带的bytes字段查询,不需要额外权限:
SELECT table_catalog, table_schema, table_name, bytes / 1024 / 1024 AS storage_usage_MB FROM TEST_DB.INFORMATION_SCHEMA.TABLES WHERE table_type = 'BASE TABLE';
内容的提问来源于stack exchange,提问作者Priya Chauhan
相关产品推荐
相关产品推荐

