Zgodnie z dokumentacją NUM_ROWS to „Liczba wierszy w tabeli” , więc widzę, jak to może być mylące. Istnieje jednak zasadnicza różnica między tymi dwiema metodami.
To zapytanie wybiera liczbę wierszy w MY_TABLE z widoku systemowego. Są to dane, które Oracle wcześniej zgromadził i przechowywał.
select num_rows from all_tables where table_name = 'MY_TABLE'
To zapytanie zlicza aktualną liczbę wierszy w MY_TABLE
select count(*) from my_table
Z definicji są to różne fragmenty danych. Potrzebujesz dwóch dodatkowych informacji o NUM_ROWS.
-
W dokumentacji przy nazwie kolumny znajduje się gwiazdka, która prowadzi do tej notatki:
Kolumny oznaczone gwiazdką (*) są wypełniane tylko wtedy, gdy zbierasz statystyki w tabeli za pomocą instrukcji ANALYZE lub pakietu DBMS_STATS.
Oznacza to, że jeśli nie zebrałeś statystyk w tabeli, ta kolumna nie będzie zawierała żadnych danych.
-
Statystyki zebrane w 11g+ z domyślnym
estimate_percent
lub z oszacowaniem 100% zwróci dokładną liczbę dla tego momentu. Ale statystyki zebrane przed 11g lub z niestandardowymestimate_percent
mniej niż 100%, wykorzystuje próbkowanie dynamiczne i może być nieprawidłowe. Jeśli zbierzesz 99,999%, pojedynczy wiersz może zostać pominięty, co z kolei oznacza, że otrzymana odpowiedź jest nieprawidłowa.
Jeśli Twój stół jest nigdy zaktualizowane, z pewnością można użyć ALL_TABLES.NUM_ROWS, aby sprawdzić liczbę wierszy w tabeli. Jednak , i jest to duże, jednak jeśli jakikolwiek proces wstawi lub usunie wiersze z twojej tabeli, będzie to w najlepszym razie dobre przybliżenie i zależnie od tego, czy twoja baza danych gromadzi statystyki automatycznie, może być strasznie błędne.
Ogólnie rzecz biorąc, zawsze lepiej jest policzyć liczbę wierszy w tabeli, niż polegać na tabelach systemowych.