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.
-
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.
-
Estatísticas coletadas em 11g+ com o padrãoestimate_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 umestimate_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.