593 Stimmen

Wie finden Sie die Zeilenzahl für alle Ihre Tabellen in Postgres

Ich suche nach einer Möglichkeit, die Zeilenzahl für alle meine Tabellen in Postgres zu ermitteln. Ich weiß, dass ich dies für eine Tabelle nach der anderen tun kann mit:

SELECT count(*) FROM table_name;

aber ich würde gerne die Zeilenzahl für alle Tabellen sehen und dann danach ordnen, um eine Vorstellung davon zu bekommen, wie groß meine Tabellen sind.

1voto

MrMesees Punkte 1318

Ich wollte die Gesamtsumme aus allen Tabellen und eine Liste der Tabellen mit ihren Zählungen. Ein bisschen wie ein Leistungsdiagramm, wo die meiste Zeit verbracht wurde

WITH results AS ( 
  SELECT nspname AS schemaname,relname,reltuples
    FROM pg_class C
    LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
    WHERE 
      nspname NOT IN ('pg_catalog', 'information_schema') AND
      relkind='r'
     GROUP BY schemaname, relname, reltuples
)

SELECT * FROM results
UNION
SELECT 'all' AS schemaname, 'all' AS relname, SUM(reltuples) AS "reltuples" FROM results

ORDER BY reltuples DESC

Sie können natürlich auch eine LIMIT Klausel für die Ergebnisse in dieser Version zu verwenden, damit Sie die größte n Straftäter sowie eine Gesamtzahl.

Dabei ist zu beachten, dass man es nach dem Massenimport eine Zeit lang ruhen lassen muss. Ich habe dies getestet, indem ich einfach 5000 Zeilen zu einer Datenbank über mehrere Tabellen mit echten Importdaten hinzugefügt habe. Es wurden 1800 Datensätze für etwa eine Minute angezeigt (wahrscheinlich ein konfigurierbares Fenster)

Dies basiert auf https://stackoverflow.com/a/2611745/1548557 Arbeit, also danke und Anerkennung für die Abfrage innerhalb des CTE

1voto

Peter Vandivier Punkte 465

Wenn Sie in der psql Schale, mit \gexec ermöglicht es Ihnen, die Syntax auszuführen, die in Syed's Antwort y Aur's Antwort ohne manuelle Bearbeitungen in einem externen Texteditor.

with x (y) as (
    select
        'select count(*), '''||
        tablename||
        ''' as "tablename" from '||
        tablename||' '
    from pg_tables
    where schemaname='public'
)
select
    string_agg(y,' union all '||chr(10)) || ' order by tablename'
from x \gexec

Anmerkung, string_agg() wird sowohl zur Abgrenzung von union all zwischen den Anweisungen und um die getrennten Datenzeilen zu einer einzigen Einheit zusammenzufassen, die in den Puffer übertragen wird.

\gexec

Sendet den aktuellen Abfragepuffer an den Server und behandelt dann jede Spalte jeder Zeile der Abfrageausgabe (falls vorhanden) als eine auszuführende SQL-Anweisung.

0voto

Radhakrishna Punkte 11

Die folgende Abfrage liefert uns die Zeilenzahl und Größe für jede Tabelle

select table_schema, table_name, pg_relation_size('"'||tabelle_schema||'"."'||tabelle_name||'"')/1024/1024 size_MB, (xpath('/row/c/text()', query_to_xml(format('select count(*) AS c from %I.%I', table_schema, table_name), false, true,'')))[1]::text::int AS rows_n from information_schema.tables order by Größe_MB desc;

-5voto

SuperNova Punkte 20412

Sie können einfach tun select from

select from table_name;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X