选择Teradata中每个表Row Count的所有表/视图名称

时间:2013-08-08 20:46:05

标签: sql teradata rowcount tablename dynamic-queries

我遇到了一个问题。 问题是我希望从Teradata获取所有表名和行数。

我有这个查询,它给了我一个特定模式的所有视图名称。

I] SELECT TableName FROM dbc.tables WHERE tablekind='V' AND databasename='SCHEMA' order by TableName;

&安培;我有这个查询,它给出了Schema中特定表/视图的行数。

II] SELECT COUNT(*) as RowsNum FROM SCHEMA.TABLE_NAME;

现在,任何人都可以告诉我如何从查询I (TableName)获取结果并将其放入QUERY II (TABLE_NAME) 您将获得帮助。

提前致谢,

Vrinda

3 个答案:

答案 0 :(得分:1)

这是一个从数据库中的所有表中收集行数的SP,它非常基本,没有错误检查等。

它使用dbc.SysExecSQL或EXECUTE IMMEDIATE显示游标和动态SQL:

CREATE SET TABLE RowCounts
     (
      DatabaseName VARCHAR(30) CHARACTER SET LATIN NOT CASESPECIFIC,
      TableName VARCHAR(30) CHARACTER SET LATIN NOT CASESPECIFIC,
      RowCount BIGINT,
      COllectTimeStamp TIMESTAMP(2))
PRIMARY INDEX ( DatabaseName ,TableName )
;

REPLACE PROCEDURE GetRowCounts(IN DBName VARCHAR(30))
BEGIN
  DECLARE SqlTxt VARCHAR(500);
   FOR cur AS
      SELECT
         TRIM(DatabaseName) AS DBName,
         TRIM(TableName) AS TabName
      FROM dbc.Tables
      WHERE DatabaseName = :DBName
      AND TableKind = 'T'
   DO
     SET SqlTxt =
         'INSERT INTO RowCounts ' ||
         'SELECT ' ||
         '''' || cur.DBName || '''' || ',' ||
         '''' || cur.TabName || '''' || ',' ||
         'CAST(COUNT(*) AS BIGINT)' ||  ',' ||
         'CURRENT_TIMESTAMP(2) ' ||
         'FROM ' || cur.DBName ||
         '.' || cur.TabName || ';';

     --CALL dbc.sysexecsql(:SqlTxt);
     EXECUTE IMMEDIATE sqlTxt;
   END FOR;
END;

如果您无法创建表或SP,则可以使用VOLATILE TABLE(如DrBailey建议的那样)并运行以下查询返回的INSERT:

SELECT
   'INSERT INTO RowCounts ' ||
   'SELECT ' ||
   '''' || DatabaseName || '''' || ',' ||
   '''' || TableName || '''' || ',' ||
   'CAST(COUNT(*) AS BIGINT)' ||  ',' ||
   'CURRENT_TIMESTAMP(2) ' ||
   'FROM ' || DatabaseName ||
   '.' || TableName || ';'
FROM dbc.tablesV 
WHERE tablekind='V' 
AND databasename='schema' 
ORDER BY TableName;

但是你的系统上可能已经存在这样的例程,你可能会问你DBA。如果它不必100%准确,则此信息也可能从收集的统计信息中提取。

答案 1 :(得分:1)

使用dnoeth的答案,但使用create“create volatile table”,这将使用您的假脱机创建表,并在会话关闭时删除所有数据。 您无需使用易失性表格的写入权限。

答案 2 :(得分:0)

有什么方法可以不使用count()从系统表中查找表/视图的行数。 Count()花了很长时间才争夺大桌。 dbc.statsv视图仅包含表,因为我们无法收集视图的统计信息。