Laut Dokumentation ist NUM_ROWS die "Anzahl der Zeilen in der Tabelle" , also kann ich sehen, wie das verwirrend sein könnte. Es gibt jedoch einen großen Unterschied zwischen diesen beiden Methoden.
Diese Abfrage wählt die Anzahl der Zeilen in MY_TABLE aus einer Systemansicht aus. Dies sind Daten, die Oracle zuvor gesammelt und gespeichert hat.
select num_rows from all_tables where table_name = 'MY_TABLE'
Diese Abfrage zählt die aktuelle Anzahl von Zeilen in MY_TABLE
select count(*) from my_table
Per Definition handelt es sich um Differenzdaten. Sie benötigen zwei zusätzliche Informationen zu NUM_ROWS.
-
In der Dokumentation gibt es ein Sternchen neben dem Spaltennamen, was zu diesem Hinweis führt:
Mit einem Sternchen (*) gekennzeichnete Spalten werden nur ausgefüllt, wenn Sie mit der ANALYZE-Anweisung oder dem DBMS_STATS-Paket Statistiken über die Tabelle sammeln.
Das bedeutet, dass diese Spalte keine Daten enthalten wird, es sei denn, Sie haben Statistiken über die Tabelle gesammelt.
-
In 11g+ gesammelte Statistiken mit dem Standardwert
estimate_percent
, oder mit einer Schätzung von 100 %, gibt eine genaue Zahl für diesen Zeitpunkt zurück. Aber Statistiken, die vor 11g oder mit einem benutzerdefiniertenestimate_percent
gesammelt wurden weniger als 100 %, verwendet dynamisches Sampling und kann falsch sein. Wenn Sie 99,999 % erhalten, wird möglicherweise eine einzelne Zeile übersehen, was wiederum bedeutet, dass die Antwort, die Sie erhalten, falsch ist.
Wenn Ihr Tisch nie ist aktualisiert, dann ist es sicherlich möglich, ALL_TABLES.NUM_ROWS zu verwenden, um die Anzahl der Zeilen in einer Tabelle zu ermitteln. Allerdings , und es ist ein großer Wert, wenn irgendein Prozess Zeilen aus Ihrer Tabelle einfügt oder löscht, ist dies bestenfalls eine gute Annäherung und je nachdem, ob Ihre Datenbank Statistiken automatisch sammelt, könnte es schrecklich falsch sein.
Im Allgemeinen ist es immer besser, die Anzahl der Zeilen in der Tabelle tatsächlich zu zählen, anstatt sich auf die Systemtabellen zu verlassen.