Snowflake中是否存在Teradata DBC.TABLES/DBC.COLUMNS的等效对象?
Snowflake元数据查询等效方案
Snowflake内置了和Teradata dbc.tables、dbc.columns功能完全对等的系统视图,可直接实现指定数据库下的表、列元数据查询,不需要额外安装组件。
核心视图对应关系
- Teradata
dbc.tables(表级元数据)对应Snowflake两类视图:- 全账户批量查询推荐:
SNOWFLAKE.ACCOUNT_USAGE.TABLES,覆盖账户下所有对象元数据,数据延迟约1小时,会保留已删除对象的历史记录 - 实时查询推荐:各数据库下的
INFORMATION_SCHEMA.TABLES,无数据延迟,仅返回当前角色有权限访问的对象
- 全账户批量查询推荐:
- Teradata
dbc.columns(列级元数据)对应Snowflake两类视图:- 全账户批量查询推荐:
SNOWFLAKE.ACCOUNT_USAGE.COLUMNS - 实时查询推荐:各数据库下的
INFORMATION_SCHEMA.COLUMNS
- 全账户批量查询推荐:
等效查询SQL示例
1. 查询A、B、C三个数据库下的所有表信息(完全匹配原Teradata语句逻辑)
使用ACCOUNT_USAGE视图写法最简便,和原Teradata查询逻辑一致,不需要拼接多段查询:
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.TABLES WHERE TABLE_CATALOG IN ('A', 'B', 'C') -- Snowflake中数据库名称对应字段为TABLE_CATALOG AND DELETED IS NULL; -- 过滤掉已经被删除的历史表记录
如果需要无延迟的实时结果,可以通过UNION ALL拼接三个库的INFORMATION_SCHEMA查询:
SELECT * FROM A.INFORMATION_SCHEMA.TABLES UNION ALL SELECT * FROM B.INFORMATION_SCHEMA.TABLES UNION ALL SELECT * FROM C.INFORMATION_SCHEMA.TABLES;
2. 查询A、B、C三个数据库下的所有列名清单
SELECT TABLE_CATALOG AS DATABASE_NAME, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, IS_NULLABLE FROM SNOWFLAKE.ACCOUNT_USAGE.COLUMNS WHERE TABLE_CATALOG IN ('A', 'B', 'C') AND DELETED IS NULL;
注意:查询ACCOUNT_USAGE视图需要账号级MONITOR权限,普通业务角色如果没有该权限,可以使用对应库下的INFORMATION_SCHEMA视图查询自己有权限访问的对象元数据。
内容的提问来源于stack exchange,提问作者Harshi
相关产品推荐
相关产品推荐

