Oracle
 sql >> Database >  >> RDS >> Oracle

Conteggio righe Oracle della tabella per conteggio (*) rispetto a NUM_ROWS da DBA_TABLES

Secondo la documentazione NUM_ROWS è il "Numero di righe nella tabella" , quindi posso vedere come questo potrebbe creare confusione. C'è, tuttavia, una grande differenza tra questi due metodi.

Questa query seleziona il numero di righe in MY_TABLE da una vista di sistema. Si tratta di dati che Oracle ha precedentemente raccolto e archiviato.

select num_rows from all_tables where table_name = 'MY_TABLE'

Questa query conta il numero corrente di righe in MY_TABLE

select count(*) from my_table

Per definizione sono dati differenziati. Sono necessarie altre due informazioni su NUM_ROWS.

  1. Nella documentazione c'è un asterisco accanto al nome della colonna, che porta a questa nota:

    Le colonne contrassegnate da un asterisco (*) vengono popolate solo se raccogli le statistiche sulla tabella con l'istruzione ANALYZE o il pacchetto DBMS_STATS.

    Ciò significa che, a meno che tu non abbia raccolto le statistiche sulla tabella, questa colonna non conterrà alcun dato.

  2. Statistiche raccolte in 11g+ con il estimate_percent predefinito , o con una stima del 100%, restituirà un numero preciso per quel momento. Ma le statistiche raccolte prima di 11g o con un estimate_percent personalizzato inferiore al 100%, utilizza il campionamento dinamico e potrebbe non essere corretto. Se raccogli il 99,999%, una singola riga potrebbe essere persa, il che a sua volta significa che la risposta che ottieni non è corretta.

Se il tuo tavolo è mai aggiornato quindi è sicuramente possibile utilizzare ALL_TABLES.NUM_ROWS per scoprire il numero di righe in una tabella. Tuttavia , ed è un grosso problema, tuttavia, se un processo inserisce o elimina righe dalla tabella, sarà nella migliore delle ipotesi una buona approssimazione e, a seconda che il tuo database raccolga automaticamente le statistiche, potrebbe essere terribilmente sbagliato.

In generale, è sempre meglio contare effettivamente il numero di righe nella tabella piuttosto che fare affidamento sulle tabelle di sistema.