Count(*) de todas as tabelas
Olá, pessoal.
Uma pergunta frequente em fóruns e afins é “como saber a quantidade de linhas em cada tabela de um schema?”.
Basicamente a atividade consiste em algo similar a um select count(*)… em todas as tabelas, e dependendo da quantidade de objetos pode levar um tempo enorme!
Portanto, para que você possa alcançar essas informações, trago hoje uma opção, que é utilizar a coluna NUM_ROWS das tabelas *_tables.
scott@ORCL> set head off
scott@ORCL> select 'Tabela: ' || table_name, 'Linhas:' || num_rows from user_tables;
Tabela: BIG_TABLE Linhas:1001563
Tabela: T Linhas:2
Tabela: DEPT Linhas:4
Tabela: EMP Linhas:14
Tabela: ALL_USERS_BKP Linhas:29
Tabela: TB_PESSOA Linhas:50000
Tabela: RUN_STATS Linhas:
Tabela: T1 Linhas:1002871
Tabela: T2 Linhas:1008771
9 rows selected.
Para que a opção tenha o valor exato (ou aproximado dependendo da quantidade de movimentos na tabela durante a consulta) você precisa coletar as estatísticas da mesma.
Por exemplo, observe que a tabela RUN_STATS está com a informação vazia, vamos coletar as estatísticas desta tabela e depois rodar novamente a contagem
scott@ORCL> BEGIN dbms_stats.gather_table_stats('SCOTT','RUN_STATS');
2 end;
3 /
PL/SQL procedure successfully completed.
Uma outra opção, caso a base não seja muito grande ou você puder realizar a operação, é aplicar a coleta no schema inteiro.
scott@ORCL> EXEC DBMS_STATS.gather_schema_stats('SCOTT');
PL/SQL procedure successfully completed.
E agora…
scott@ORCL> select 'Tabela: ' || table_name, 'Linhas:' || num_rows from user_tables;
'TABELA:'||TABLE_NAME 'LINHAS:'||NUM_ROWS
-------------------------------------- -----------------------------------------------
Tabela: BIG_TABLE Linhas:1003859
Tabela: T Linhas:2
Tabela: DEPT Linhas:4
Tabela: EMP Linhas:14
Tabela: ALL_USERS_BKP Linhas:29
Tabela: TB_PESSOA Linhas:50000
Tabela: RUN_STATS Linhas:0
Tabela: T1 Linhas:1002488
Tabela: T2 Linhas:496014
9 rows selected.
Veja que agora aparece o valor 0 na RUN_STATS (lembre sempre que vazio é diferente de ter algum valor, nesse caso 0) e que os valores de outras tabelas mudaram em relação ao primeiro select.
Lembrando que podemos utilizar filtros nos nomes das tabelas para reduzir o número de resultados, caso necessário.
É isso pessoal, espero ter ajudado no seu dia-a-dia.
Abraços