Teradata只读权限下获取50个架构所有表行数的查询方法
Teradata只读权限下统计指定架构表行数的解决方案
由于DBC.TableStatsV的行数统计存在误差,且你仅有只读权限无法创建存储过程,可通过以下方式基于DBC.TablesV生成实际统计行数的SQL:
方法1:生成单表统计语句(手动拼接)
执行以下查询,生成每个表的COUNT语句:
SELECT 'SELECT ''' || DatabaseName || ''' AS 架构名, ''' || TableName || ''' AS 表名, COUNT(*) AS 行数 FROM ' || DatabaseName || '.' || TableName || ' UNION ALL' FROM DBC.TablesV WHERE DatabaseName IN ('架构1', '架构2', ..., '架构50') -- 替换为你的50个架构名称 AND TableType = 'T' -- 仅统计普通表,需统计视图则改为'V' ORDER BY DatabaseName, TableName;
将查询结果中的所有语句复制,删除最后一行末尾的UNION ALL后执行,即可得到所有表的实际行数。
方法2:自动拼接完整SQL(无需手动修改)
利用Teradata的XMLAGG函数直接生成可执行的完整统计SQL:
SELECT XMLAGG( ('SELECT ''' || DatabaseName || ''' AS 架构名, ''' || TableName || ''' AS 表名, COUNT(*) AS 行数 FROM ' || DatabaseName || '.' || TableName) || ' UNION ALL' ORDER BY DatabaseName, TableName ).GetClobVal() || ' SELECT '''' AS 架构名, '''' AS 表名, 0 AS 行数 WHERE 1=0' FROM DBC.TablesV WHERE DatabaseName IN ('架构1', '架构2', ..., '架构50') AND TableType = 'T';
复制查询结果生成的完整SQL语句执行即可,末尾的空查询用于抵消最后一个UNION ALL,避免语法错误。
注意事项
- 若表名或架构名包含特殊字符(如空格、大小写敏感名称),需用双引号包裹,此时需修改语句中的名称部分为
'"' || DatabaseName || '"'和'"' || TableName || '"' - 若表数量庞大,建议按架构分批次执行统计,避免单次查询耗时过长
- Teradata中
DBC.TablesV就是对应OracleALL_TABLES的系统视图,可通过它筛选所有有权限访问的表
内容的提问来源于stack exchange,提问作者Francis Edison
相关产品推荐
相关产品推荐

