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.
-
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.
-
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 unestimate_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.