Выберите все имена таблиц/представлений с количеством строк каждой таблицы в Teredata

Я застрял в вопросе. Вопрос в том, что я хочу получить все имена таблиц с их количеством строк из Teradata.

У меня есть этот запрос, который дает мне все имя представления из определенной схемы.

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

& У меня есть этот запрос, который дает мне количество строк для конкретной таблицы/представления в схеме.

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

Теперь кто-нибудь может сказать мне, что делать, чтобы получить результат из запроса I (TableName) и поместить его в QUERY II (TABLE_NAME) Ваша помощь будет оценена по достоинству.

Заранее спасибо,

Вринда


person vrindamarfatia    schedule 08.08.2013    source источник


Ответы (3)


Это SP для сбора количества строк из всех таблиц в базе данных, он очень простой, без проверки ошибок и т. д.

Он показывает курсор и динамический SQL, используя dbc.SysExecSQL или EXECUTE IMMEDIATE:

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;

Но подобная процедура может уже существовать в вашей системе, вы можете спросить у администратора базы данных. Если это не должно быть на 100% точным, эта информация также может быть извлечена из собранной статистики.

person dnoeth    schedule 08.08.2013
comment
Эй, спасибо за ответ, но мне не разрешено создавать таблицу, доступен только выбор гранта. :( - person vrindamarfatia; 13.08.2013
comment
Если у вас нет прав на создание таблицы, вам, вероятно, также не разрешено создавать SP :-( Вместо курсора вы можете создать эти INSERT как результирующий набор, а затем запустить их. Добавил это к моему ответу. - person dnoeth; 13.08.2013
comment
Привет еще раз спасибо за помощь. На самом деле, не могли бы вы рассказать мне, как запускать все вставки после их вставки в таблицу RowCount. На самом деле запрос работает нормально и вставляет все Insert Statement в таблицу RowCount, но я не знаю, что будет дальше, т.е. как запустить все вставки. - person vrindamarfatia; 13.08.2013
comment
Запрос динамически создает статусы INSERT SELECT, вы просто вырезаете и вставляете результаты запроса в окно запроса и выполняете их. - person dnoeth; 13.08.2013
comment
Спасибо, но я на самом деле хотел, чтобы это было сделано в 1 или 2 запроса, потому что есть более 100 таблиц, и мне нужно выполнять эту задачу ежедневно каждое утро. - person vrindamarfatia; 13.08.2013
comment
Что вы собираетесь делать с этими подсчетами строк? Поговорите со своим администратором баз данных, чего вы хотите достичь и почему. - person dnoeth; 14.08.2013
comment
На самом деле мне нужно выполнить сравнение схем, поэтому мне нужно количество строк для сравнения таблиц в схемах. - person vrindamarfatia; 14.08.2013
comment
Если вам нужно запускать эту задачу каждое утро, вы должны поговорить со своим администратором баз данных, чтобы настроить процесс для этого. - person dnoeth; 14.08.2013
comment
Хорошо, я поговорю с администратором баз данных, но все же мне нужно какое-то решение. - person vrindamarfatia; 14.08.2013

Используйте ответ dnoeth, но вместо этого используйте create «create volatile table», это будет использовать вашу катушку для создания таблицы и удалит все данные, когда ваш сеанс будет закрыт. Для использования изменчивых таблиц вам не нужен доступ для записи.

person DrBailey    schedule 12.08.2013
comment
Эй, спасибо за помощь :) - person vrindamarfatia; 13.08.2013

Есть ли способ найти количество строк таблицы/представления из системных таблиц без использования count(). Count() долго запускался для больших таблиц. Представление dbc.statsv включает только таблицы, поскольку мы не можем собирать статистику представления.

person Neeraj Sharma    schedule 07.08.2019