Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Contagem de linhas do Oracle da tabela por contagem(*) vs NUM_ROWS de DBA_TABLES


De acordo com a documentação NUM_ROWS é o "Número de linhas na tabela" , para que eu possa ver como isso pode ser confuso. Há, no entanto, uma grande diferença entre esses dois métodos.

Esta consulta seleciona o número de linhas em MY_TABLE de uma visualização do sistema. Esses são os dados que a Oracle coletou e armazenou anteriormente.
select num_rows from all_tables where table_name = 'MY_TABLE'

Esta consulta conta o número atual de linhas em MY_TABLE
select count(*) from my_table

Por definição, eles são dados de diferença. Você precisa de duas informações adicionais sobre NUM_ROWS.

  1. Na documentação há um asterisco ao lado do nome da coluna, o que leva a esta nota:

    As colunas marcadas com um asterisco (*) são preenchidas somente se você coletar estatísticas na tabela com a instrução ANALYZE ou o pacote DBMS_STATS.

    Isso significa que, a menos que você tenha coletado estatísticas na tabela, essa coluna não terá dados.

  2. Estatísticas coletadas em 11g+ com o padrão estimate_percent , ou com uma estimativa de 100%, retornará um número preciso para aquele momento. Mas as estatísticas coletadas antes de 11g ou com um estimate_percent personalizado menos de 100%, usa amostragem dinâmica e pode estar incorreto. Se você reunir 99,999%, uma única linha pode ser perdida, o que significa que a resposta obtida está incorreta.

Se sua tabela nunca atualizado então é certamente possível usar ALL_TABLES.NUM_ROWS para descobrir o número de linhas em uma tabela. No entanto , e é grande, no entanto, se algum processo inserir ou excluir linhas da sua tabela, será na melhor das hipóteses uma boa aproximação e, dependendo se o banco de dados coleta estatísticas automaticamente, pode estar terrivelmente errado.

De um modo geral, é sempre melhor contar o número de linhas na tabela em vez de confiar nas tabelas do sistema.