【问题标题】:Select all Table/View Names with each table Row Count in Teredata选择 Teradata 中每个表行数的所有表/视图名称
【发布时间】:2013-08-08 20:46:05
【问题描述】:

我陷入了一个问题。 问题是我想从 Teradata 获取所有表名及其行数。

我有这个查询,它为我提供了来自特定架构的所有视图名称。

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

& 我有这个查询,它为我提供了架构中特定表/视图的行数。

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

现在谁能告诉我如何从查询 I (TableName) 获取结果并将其放入 QUERY II (TABLE_NAME) 您的帮助将不胜感激。

提前致谢,

温达

【问题讨论】:

    标签: sql teradata rowcount tablename dynamic-queries


    【解决方案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% 准确的,也可以从收集的统计数据中提取此信息。

    【讨论】:

    • 嘿,感谢您的回复,但我不允许创建表,只有选择授权可用。 :(
    • 如果您无权创建表,您可能也不允许创建 SP :-( 您可能会创建那些 INSERT 作为结果集然后运行而不是游标他们。将此添加到我的答案中。
    • 您好,再次感谢您的帮助。实际上,您能否告诉我在将所有插入插入 RowCount 表后如何运行它们。实际上查询工作正常并将所有Insert Statement 插入RowCount 表中,但我不知道下一步是什么,即如何运行所有插入。
    • 查询动态创建 INSERT SELECT 语句,您只需将查询结果剪切并粘贴到查询窗口中并执行它们。
    • 谢谢,但我实际上希望在 1 或 2 个查询中完成这项工作,因为有 100 多个表,我需要每天早上每天完成这项任务。
    【解决方案2】:

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

    【讨论】:

    • 嘿,感谢您的帮助:)
    【解决方案3】:

    有什么方法可以在不使用 count() 的情况下从系统表中找到表/视图的行数。 Count() 需要很长时间才能运行大表。 dbc.statsv 视图仅包含表,因为我们无法收集视图的统计信息。

    【讨论】:

      猜你喜欢
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      相关资源
      最近更新 更多