it-swarm.com.de

Schnellster Weg, um die genaue Anzahl von Zeilen in einer sehr großen Tabelle zu zählen?

Ich bin auf Artikel gestoßen, die besagen, dass SELECT COUNT(*) FROM TABLE_NAME langsam ist, wenn die Tabelle viele Zeilen und viele Spalten enthält.

Ich habe eine Tabelle, die sogar Milliarden von Zeilen enthalten kann (sie hat ungefähr 15 Spalten). Gibt es einen besseren Weg, die Anzahl der Zeilen einer Tabelle EXACT zu ermitteln?

Bitte bedenken Sie folgendes vor Ihrer Antwort:

  • Ich suche einen unabhängigen Datenbankanbieter . Es ist in Ordnung, wenn MySQL, Oracle, MS SQL Server ..__ abdeckt. Wenn jedoch wirklich keine Datenbank Ich Werde mich mit unterschiedlichen Lösungen Für verschiedene Datenbankanbieter zufrieden geben.

  • Ich kann kein anderes externes Werkzeug verwenden. Ich bin hauptsächlich auf der Suche nach einer SQL-basierten Lösung.

  • Ich kann mein Datenbankdesign nicht weiter normalisieren. Es ist bereits in 3NF und darüber hinaus wurde bereits eine Menge Code geschrieben .

201
Swaranga Sarma

Einfache Antwort:

  • Datenbankanbieter-unabhängige Lösung = Standard verwenden = COUNT(*)
  • Es gibt ungefähre SQL Server-Lösungen, aber verwenden Sie COUNT (*) = nicht außerhalb des Gültigkeitsbereichs

Anmerkungen:

COUNT (1) = COUNT (*) = COUNT (PrimaryKey) nur für den Fall

Bearbeiten:

SQL Server-Beispiel (1,4 Milliarden Zeilen, 12 Spalten)

SELECT COUNT(*) FROM MyBigtable WITH (NOLOCK)
-- NOLOCK here is for me only to let me test for this answer: no more, no less

1 Läufe, 5:46 Minuten, Anzahl = 1.401.659.700

--Note, sp_spaceused uses this DMV
SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
    object_name(object_id) = 'MyBigtable' AND (index_id < 2)

2 Läufe, beide unter 1 Sekunde, Anzahl = 1.401.659.670

Die zweite hat weniger Zeilen = falsch. Wäre gleich oder mehr abhängig von Schreibvorgängen (Löschungen werden hier außerhalb der Öffnungszeiten vorgenommen) 

212
gbn

Der mit Abstand schnellste Weg bei MySQL ist:

SHOW TABLE STATUS;

Sie erhalten sofort alle Ihre Tabellen mit der Zeilenzahl (die Gesamtzahl) und vielen zusätzlichen Informationen, wenn Sie möchten.

25
salbahra

Ich habe Artikel gefunden, die besagen, dass SELECT COUNT (*) FROM TABLE_NAME langsam ist, wenn die Tabelle viele Zeilen und viele Spalten enthält.

Das hängt von der Datenbank ab. Einige beschleunigen die Zählungen, indem sie beispielsweise nachverfolgen, ob Zeilen im Index lebend oder tot sind, sodass ein Index nur die Anzahl der Zeilen ermitteln kann. Andere wiederum müssen nicht den gesamten Tisch besuchen und Live-Zeilen nacheinander zählen. Beides wird für einen großen Tisch langsam sein.

Beachten Sie, dass Sie im Allgemeinen eine gute Schätzung mithilfe von Abfrageoptimierungswerkzeugen, Tabellenstatistiken usw. extrahieren können. Im Fall von PostgreSQL können Sie beispielsweise die Ausgabe von explain count(*) from yourtable analysieren und eine relativ gute Schätzung der Anzahl der Zeilen erhalten. Was bringt mich zu Ihrer zweiten Frage.

Ich habe eine Tabelle, die sogar Milliarden von Zeilen enthalten kann (sie hat ungefähr 15 Spalten). Gibt es eine bessere Möglichkeit, die genaue Anzahl der Zeilen einer Tabelle zu ermitteln?

Ernst? :-) Du meinst wirklich die genaue Anzahl aus einer Tabelle mit Milliarden Reihen? Bist du dir wirklich sicher? :-)

Wenn Sie wirklich tun, können Sie mithilfe von Triggern den Überblick über die Gesamtmenge behalten. Beachten Sie jedoch die Parallelität und Deadlocks.

10

Sie können dies sp_spaceused (Transact-SQL) .

Zeigt die Anzahl der Zeilen an. reservierter Speicherplatz und Speicherplatz, der von .__ verwendet wird. eine Tabelle, eine indizierte Sicht oder ein Service Broker-Warteschlange in der aktuellen Datenbank oder zeigt den reservierten Speicherplatz an und von der gesamten Datenbank verwendet.

9
jams

Gibt es eine bessere Möglichkeit, die genaue Anzahl der Zeilen einer Tabelle zu ermitteln?

Um Ihre Frage einfach zu beantworten, ist Nein.

Wenn Sie eine DBMS-unabhängige Methode dafür benötigen, ist die schnellste Methode immer:

SELECT COUNT(*) FROM TableName

Einige DBMS-Anbieter verfügen möglicherweise über schnellere Methoden, die nur für ihre Systeme funktionieren. Einige dieser Optionen sind bereits in anderen Antworten enthalten.

COUNT(*) sollte ohnehin vom DBMS (zumindest einer PROD-würdigen DB) optimiert werden. Versuchen Sie also nicht, ihre Optimierungen zu umgehen.

Als Randnotiz:
Ich bin sicher, dass viele Ihrer anderen Abfragen aufgrund ihrer Tabellengröße auch sehr lange dauern. Alle Bedenken hinsichtlich der Leistung sollten möglicherweise durch Überlegung über Ihr Schemadesign im Hinblick auf die Geschwindigkeit berücksichtigt werden. Ich weiß, dass Sie gesagt haben, dass es keine Option zum Ändern ist, aber es könnte sich herausstellen, dass Abfragen von mehr als 10 Minuten ebenfalls keine Option sind. 3. NF ist nicht immer der beste Ansatz, wenn Sie Geschwindigkeit benötigen. Manchmal können Daten in mehreren Tabellen partitioniert werden, wenn die Datensätze nicht durch zusammen gespeichert werden. Etwas zum Nachdenken...

8
Jesse Webb

Ich benutze 

select /*+ parallel(a) */  count(1) from table_name a;
5
Mainsh S

Ich bin bei weitem nicht so sachkundig wie andere, die geantwortet haben, aber ich hatte ein Problem mit einer Prozedur, mit der ich eine zufällige Zeile aus einer Tabelle auswählte (nicht besonders relevant), aber ich musste die Anzahl der Zeilen in meiner Referenztabelle kennen um den Zufallsindex zu berechnen. Mit der traditionellen Count (*) - oder Count (1) - Arbeit konnte ich gelegentlich bis zu 2 Sekunden warten, bis meine Abfrage ausgeführt wurde. Stattdessen verwende ich (für meine Tabelle 'tbl_HighOrder'):

Declare @max int

Select @max = Row_Count
From sys.dm_db_partition_stats
Where Object_Name(Object_Id) = 'tbl_HighOrder'

Es funktioniert gut und die Abfragezeiten in Management Studio sind null.

5
john rains

Nun, spät um 5 Jahre und unsicher, ob es hilft:

Ich habe versucht, das Nein zu zählen. von Zeilen in einer SQL Server-Tabelle mit MS SQL Server Management Studio und einem Überlauffehler auftrat, dann habe ich folgendes verwendet:

select count_big (1) FROM [Datenbankname]. [dbo]. [FactSampleValue];

Das Ergebnis :

24296650578 Zeilen

4

Wenn SQL Server Edition 2005/2008 ist, können Sie die Zeilenanzahl in einer Tabelle mit DMVs berechnen:

-- Shows all user tables and row counts for the current database 
-- Remove is_ms_shipped = 0 check to include system objects 
-- i.index_id < 2 indicates clustered index (1) or hash table (0) 
SELECT o.name, 
 ddps.row_count 
FROM sys.indexes AS i 
 INNER JOIN sys.objects AS o ON i.OBJECT_ID = o.OBJECT_ID 
 INNER JOIN sys.dm_db_partition_stats AS ddps ON i.OBJECT_ID = ddps.OBJECT_ID 
 AND i.index_id = ddps.index_id 
WHERE i.index_id < 2 
 AND o.is_ms_shipped = 0 
ORDER BY o.NAME 

Für das SQL Server 2000-Datenbankmodul funktioniert sysindexes, es wird jedoch dringend empfohlen, es in zukünftigen Editionen von SQL Server nicht zu verwenden, da es in naher Zukunft entfernt werden kann.

Beispielcode aus: Wie man schnell und schmerzlos Tabellenzeilen erhält

4
Alireza Maddah

Ich komme zu spät zu dieser Frage, aber hier ist, was Sie mit MySQL machen können (da ich MySQL verwende). Ich teile meine Beobachtungen hier:

1) SELECT COUNT(*) AS TOTAL_ROWS FROM <TABLE_NAME>

Ergebnis  
Zeilenanzahl: 508534
Konsolenausgabe: Betroffene Zeilen: 0 Zeilen gefunden: 1 Warnungen: 0 Dauer für 1 Abfrage: 0,125 Sek.
Es dauert eine Weile für eine Tabelle mit einer großen Anzahl von Zeilen, aber die Zeilenanzahl ist sehr genau.

2) SHOW TABLE STATUS or SHOW TABLE STATUS WHERE NAME="<TABLE_NAME>"

Ergebnis  
Zeilenanzahl: 511235
Konsolenausgabe: Betroffene Zeilen: 0 Zeilen gefunden: 1 Warnungen: 0 Dauer für 1 Abfrage: 0.250 Sek Zusammenfassung: Die Anzahl der Zeilen ist nicht genau.

3) SELECT * FROM information_schema.tables WHERE table_schema = DATABASE();

Ergebnis  
Zeilenanzahl: 507806
Konsolenausgabe: Betroffene Zeilen: 0 Gefundene Zeilen: 48 Warnungen: 0 Dauer für 1 Abfrage: 1.701 Sek.
Die Anzahl der Zeilen ist nicht genau.

Ich bin kein MySQL- oder Datenbank-Experte, aber ich habe festgestellt, dass Sie für sehr große Tabellen die Optionen 2 oder 3 verwenden können, um eine 'gute Vorstellung' darüber zu erhalten, wie viele Zeilen vorhanden sind.

Ich musste diese Zeilenanzahl für die Anzeige einiger Statistiken auf der Benutzeroberfläche ermitteln. Bei den oben genannten Abfragen wusste ich, dass die Gesamtzahl der Zeilen mehr als 500.000 betrug. Daher kam ich dazu, Statistiken wie "Mehr als 500.000 Zeilen" anzuzeigen, ohne die genaue Anzahl der Zeilen anzuzeigen. 

Vielleicht habe ich die Frage des OP nicht wirklich beantwortet, aber ich teile mit, was ich in einer Situation getan habe, in der solche Statistiken erforderlich waren. In meinem Fall war das Anzeigen der ungefähren Reihen akzeptabel und so funktionierten die obigen Angaben für mich.

3
sunitkatkar

Ich glaube nicht, dass es eine generell immer schnellste Lösung gibt: Einige RDBMS/Versionen haben eine spezielle Optimierung für SELECT COUNT(*), die schnellere Optionen verwendet, während andere nur Tabellenscan verwenden. Sie müssten für die zweite Gruppe zu den Dokumentations-/Support-Websites gehen, für die wahrscheinlich eine spezifischere Abfrage erforderlich ist, die normalerweise auf einen Index zutrifft.

BEARBEITEN:

Hier ist ein Gedanke, der je nach Schema und Verteilung der Daten funktionieren kann: Verfügen Sie über eine indizierte Spalte, die auf einen steigenden Wert, eine numerisch aufsteigende ID oder einen Zeitstempel oder ein Datum verweist? Unter der Annahme, dass Löschungen nicht stattfinden, sollte es möglich sein, die Zählung bis zu einem letzten Wert (Datum von gestern, höchster ID-Wert an einem letzten Stichprobenpunkt) zu speichern und die Zählung darüber hinaus hinzuzufügen, was sich im Index sehr schnell auflösen sollte . Natürlich abhängig von Werten und Indizes, jedoch für nahezu jede Version eines DBMS.

3
Mike Woodhouse

Wenn insert Auslöser zu teuer für die Verwendung ist, aber ein delete Auslöser verfügbar sein könnte und ein Auto-Inkrement idvorhanden ist, nachdem die gesamte Tabelle einmal gezählt wurde und sich die Zählung als erinnert last-count und der last-counted-id,

dann jeden Tag muss nur für id> last-counted-id gezählt werden, das zu last-count addieren und den neuen last-counted-id speichern.

Der Löschauslöser würde die letzte Zählung verringern, wenn die ID des gelöschten Datensatzes <= letzte Zählung-ID ist.

2
ToolmakerSteve

Nicht gerade eine DBMS-agnostische Lösung, aber zumindest sieht Ihr Client-Code den Unterschied nicht aus ...

Erstellen Sie eine weitere Tabelle T mit nur einer Zeile und einem ganzzahligen Feld N1und INSERT TRIGGER erstellen, das gerade ausgeführt wird:

UPDATE T SET N = N + 1

Erstellen Sie auch einen DELETE TRIGGER, der Folgendes ausführt:

UPDATE T SET N = N - 1

Ein DBMS, das sein Salz wert ist, garantiert die Atomizität der oben genannten Vorgänge2, und N enthält immer die genaue Anzahl der Zeilen, die dann sehr schnell zu bekommen sind:

SELECT N FROM T

Trigger sind zwar DBMS-spezifisch, die Auswahl aus T ist jedoch nicht und Ihr Client-Code muss nicht für jedes unterstützte DBMS geändert werden.

Dies kann jedoch zu Problemen mit der Skalierbarkeit führen, wenn die Tabelle INSERT- oder DELETE-intensiv ist, insbesondere wenn Sie nicht unmittelbar nach INSERT/DELETE einen COMMIT ausführen.


 1 Diese Namen sind nur Platzhalter - verwenden Sie in der Produktion etwas Sinnvolleres.

 2 D.h. N kann nicht durch eine gleichzeitige Transaktion zwischen Lesen und Schreiben in N geändert werden, solange sowohl Lesen als auch Schreiben in einer einzigen SQL-Anweisung erfolgt.

2

Ich fand diesen guten Artikel SQL Server-HOW-TO: schnelles Abrufen der genauen Zeilenzahl für Tabelle aus martijnh1, was für jedes Szenario eine gute Zusammenfassung bietet.

Ich muss das erweitern, wenn ich eine Zählung basierend auf einer bestimmten Bedingung angeben muss, und wenn ich diesen Teil finde, werde ich diese Antwort weiter aktualisieren.

In der Zwischenzeit hier die Details aus dem Artikel:

Methode 1:

Abfrage: 

SELECT COUNT(*) FROM Transactions 

Bemerkungen: 

Führt einen vollständigen Tabellenscan durch. Langsam an großen Tischen. 

Methode 2:

Abfrage:

SELECT CONVERT(bigint, rows) 
FROM sysindexes 
WHERE id = OBJECT_ID('Transactions') 
AND indid < 2 

Bemerkungen:

Schnelle Möglichkeit, die Zeilenanzahl abzurufen. Hängt von Statistiken ab und ist ungenau. 

Führen Sie DBCC UPDATEUSAGE (Datenbank) WITH COUNT_ROWS aus. Dies kann bei großen Tabellen viel Zeit in Anspruch nehmen. 

Methode 3:

Abfrage:

SELECT CAST(p.rows AS float) 
FROM sys.tables AS tbl 
INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id and
idx.index_id < 2 
INNER JOIN sys.partitions AS p ON p.object_id=CAST(tbl.object_id AS int) 
AND p.index_id=idx.index_id 
WHERE ((tbl.name=N'Transactions' 
AND SCHEMA_NAME(tbl.schema_id)='dbo')) 

Bemerkungen:

Die Art und Weise, wie das SQL Management Studio Zeilen zählt (siehe Tabelleneigenschaften, Speicher, Zeilenanzahl). Sehr schnell, aber immer noch eine ungefähre Anzahl von Reihen. 

Methode 4:

Abfrage:

SELECT SUM (row_count) 
FROM sys.dm_db_partition_stats 
WHERE object_id=OBJECT_ID('Transactions')    
AND (index_id=0 or index_id=1); 

Bemerkungen:

Schnelle (wenn auch nicht so schnelle Methode wie Methode 2) und ebenso wichtig, zuverlässig. 

2
Thierry

Eine wortwörtlich verrückte Antwort, aber wenn Sie ein Replikationssystem eingerichtet haben (für ein System mit einer Milliarde Zeilen, ich hoffe, das tun Sie), können Sie einen groben Schätzer verwenden (wie MAX(pk)), teilen Sie diesen Wert durch die Anzahl von Slaves, die Sie haben, führen Sie mehrere Abfragen parallel aus. 

In den meisten Fällen würden Sie die Abfragen auf der Grundlage des besten Schlüssels (oder des primären Schlüssels, den ich vermute) auf verschiedene Slaves aufgeteilt (so werden wir 250000000 als unsere Reihen/Slaves verwenden):

-- First slave
SELECT COUNT(pk) FROM t WHERE pk < 250000000
-- Ith slave where 2 <= I <= N - 1
SELECT COUNT(pk) FROM t WHERE pk >= I*250000000 and pk < (I+1)*250000000
-- Last slave
SELECT COUNT(pk) FROM t WHERE pk > (N-1)*250000000

Sie benötigen jedoch nur SQL. Was für eine Büste. Ok, nehmen wir an, Sie sind ein Sadomasochist ... Auf dem Master (oder dem nächsten Sklaven) müssten Sie höchstwahrscheinlich eine Tabelle dafür erstellen:

CREATE TABLE counter_table (minpk integer, maxpk integer, cnt integer, slaveid integer)

Anstatt also nur die Selects in Ihren Slaves auszuführen, müssen Sie ein Insert machen, ähnlich wie dieses:

INSERT INTO counter_table VALUES (I*25000000, (I+1)*250000000, (SELECT COUNT(pk) FROM ... ), @@SLAVE_ID)

Sie können auf Probleme mit Slaves stoßen, die in eine Tabelle auf Master schreiben. Möglicherweise müssen Sie noch mehr traurig sein - ich meine, kreativ:

-- A table per slave!
INSERT INTO counter_table_slave_I VALUES (...)

Am Ende sollte ein Slave vorhanden sein, der zuletzt in dem Pfad vorhanden ist, den der Replikationsgraph durchläuft, relativ zum ersten Slave. Dieser Slave sollte jetzt alle anderen Zählerwerte und seine eigenen Werte haben. Aber wenn Sie fertig sind, werden wahrscheinlich Zeilen hinzugefügt. Sie müssen also eine weitere einfügen, die den aufgezeichneten Max-Pk in Ihrer counter_table und den aktuellen Max-Pk ausgleicht.

An diesem Punkt müssten Sie eine Aggregatfunktion ausführen, um die Gesamtzahl der Zeilen herauszufinden. Dies ist jedoch einfacher, da Sie sie höchstens mit der Anzahl der "Slaves, die Sie haben und ändern" Zeilen ausführen.

Wenn sich in den Slaves separate Tabellen befinden, können Sie UNION verwenden, um alle benötigten Zeilen zu erhalten.

SELECT SUM(cnt) FROM (
    SELECT * FROM counter_table_slave_1
      UNION
    SELECT * FROM counter_table_slave_2
      UNION
    ...
  )

Oder wissen Sie, seien Sie ein bisschen weniger wahnsinnig und migrieren Sie Ihre Daten zu einem verteilten Verarbeitungssystem, oder verwenden Sie möglicherweise eine Data Warehousing-Lösung (die Ihnen auch in Zukunft ein unglaubliches Daten-Crunching ermöglicht).

Beachten Sie, dass dies davon abhängt, wie gut Ihre Replikation eingerichtet ist. Da der primäre Engpass höchstwahrscheinlich persistenter Speicher ist, führt dies bei langsamer Speicherung oder unzureichend getrennten Datenspeichern mit starkem Nachbarrauschen dazu, dass Sie langsamer laufen, als nur auf einen einzelnen SELECT COUNT(*) ... zu warten.

Wenn Sie jedoch eine gute Replikation haben, sollten sich Ihre Geschwindigkeitsgewinne direkt auf die Anzahl oder die Slaves beziehen. Wenn die Zählabfrage allein 10 Minuten dauert und Sie 8 Slaves haben, reduzieren Sie die Zeit auf weniger als ein paar Minuten. Vielleicht eine Stunde, um die Details dieser Lösung auszubügeln. 

Natürlich werden Sie nie wirklich eine erstaunlich genaue Antwort erhalten, da diese verteilte Lösung ein wenig Zeit einleitet, in der Zeilen gelöscht und eingefügt werden können. Sie können jedoch versuchen, eine verteilte Zeilensperre an derselben Instanz zu erhalten und eine genaue Zählung zu erhalten der Zeilen in der Tabelle für einen bestimmten Zeitpunkt. 

Tatsächlich scheint dies unmöglich zu sein, da Sie grundsätzlich nur mit einer SQL-Lösung arbeiten und ich glaube nicht, dass Ihnen ein Mechanismus bereitgestellt wird, mit dem eine Sharded- und Locked-Abfrage über mehrere Slaves hinweg ausgeführt werden kann. Vielleicht, wenn Sie die Kontrolle über die Replikationsprotokolldatei hatten ... was bedeutet, dass Sie zu diesem Zweck buchstäblich Sklaven hochfahren würden, was zweifellos langsamer ist, als die Zählabfrage ohnehin auf einer einzelnen Maschine auszuführen.

Also gibt es meine zwei 2013-Pennies.

2
Yangmun Choi

Ich habe dieses Skript von einer anderen StackOverflow-Frage/Antwort erhalten:

SELECT SUM(p.rows) FROM sys.partitions AS p
  INNER JOIN sys.tables AS t
  ON p.[object_id] = t.[object_id]
  INNER JOIN sys.schemas AS s
  ON s.[schema_id] = t.[schema_id]
  WHERE t.name = N'YourTableNameHere'
  AND s.name = N'dbo'
  AND p.index_id IN (0,1);

Mein Tisch hat 500 Millionen Datensätze und die oben genannten Ergebnisse werden in weniger als 1 ms erzielt.

SELECT COUNT(id) FROM MyTable

dauert volle 39 Minuten, 52 Sekunden!

Sie ergeben exakt die gleiche Anzahl von Zeilen (in meinem Fall genau 519326012).

Ich weiß nicht, ob das immer so wäre.

2
JakeJ

Wenn Sie eine typische Tabellenstruktur mit einer automatisch inkrementierenden Primärschlüsselspalte haben, in der Zeilen niemals gelöscht werden, ist der folgende Weg der schnellste Weg, um die Datensatzanzahl zu ermitteln, und sollte in den meisten ANSI-kompatiblen Datenbanken ähnlich funktionieren:

SELECT TOP(1) <primarykeyfield> FROM <table> ORDER BY <primarykeyfield> DESC;

Ich arbeite mit MS SQL-Tabellen, die Milliarden von Zeilen enthalten, für die die Antwortzeiten von Sekunden bis zu Sekunden, einschließlich der Anzahl der Datensätze, erforderlich sind. Ein vergleichbarer SELECT COUNT (*) würde durch Vergleich einige Minuten in Anspruch nehmen.

1
KevinS

Für SQL Server versuchen Sie dies

SELECT T.name, 
       I.rows AS [ROWCOUNT] 
FROM   sys.tables AS T 
       INNER JOIN sys.sysindexes AS I 
               ON T.object_id = I.id AND I.indid < 2 
WHERE T.name = 'Your_Table_Name'
ORDER  BY I.rows DESC 
1

Wenn Sie Oracle verwenden, wie wäre es damit (vorausgesetzt, die Tabellenstatistiken werden aktualisiert):

select <TABLE_NAME>, num_rows, last_analyzed from user_tables

last_analyzed zeigt die Zeit an, zu der die Statistiken zuletzt gesammelt wurden.

0
ZenithDreams

Setzen Sie einen Index in eine Spalte. Dadurch sollte das Optimierungsprogramm einen vollständigen Scan der Indexblöcke anstelle eines vollständigen Scans der Tabelle durchführen. Das senkt Ihre IO -Kosten erheblich. Schauen Sie sich den Ausführungsplan vorher und nachher an. Messen Sie dann die Uhrzeit der Wanduhr in beide Richtungen.

0
EvilTeach

wählen Sie Zeilen aus sysindexes Dabei ist id = Object_ID ('TableName') und indid <2

0
Enzero

Mit PostgreSQL:

SELECT reltuples AS approximate_row_count FROM pg_class WHERE relname = 'table_name'
0
Dorian