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.

9voto

Syed Mushtaq Punkte 141

Sie können diese Abfrage verwenden, um alle Tabellennamen mit ihrer Anzahl zu generieren

select ' select  '''|| tablename  ||''', count(*) from ' || tablename ||' 
union' from pg_tables where schemaname='public'; 

das Ergebnis der obigen Abfrage lautet

select  'dim_date', count(*) from dim_date union 
select  'dim_store', count(*) from dim_store union
select  'dim_product', count(*) from dim_product union
select  'dim_employee', count(*) from dim_employee union

Sie müssen die letzte Einheit entfernen und das Semikolon am Ende hinzufügen!!

select  'dim_date', count(*) from dim_date union 
select  'dim_store', count(*) from dim_store union
select  'dim_product', count(*) from dim_product union
select  'dim_employee', count(*) from dim_employee  **;**

RENNEN !!!

6voto

Gnanam Punkte 9993

Ich kann mich nicht mehr an die URL erinnern, unter der ich das gesammelt habe. Aber ich hoffe, das hilft Ihnen weiter:

CREATE TYPE table_count AS (table_name TEXT, num_rows INTEGER); 

CREATE OR REPLACE FUNCTION count_em_all () RETURNS SETOF table_count  AS '
DECLARE 
    the_count RECORD; 
    t_name RECORD; 
    r table_count%ROWTYPE; 

BEGIN
    FOR t_name IN 
        SELECT 
            c.relname
        FROM
            pg_catalog.pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
        WHERE 
            c.relkind = ''r''
            AND n.nspname = ''public'' 
        ORDER BY 1 
        LOOP
            FOR the_count IN EXECUTE ''SELECT COUNT(*) AS "count" FROM '' || t_name.relname 
            LOOP 
            END LOOP; 

            r.table_name := t_name.relname; 
            r.num_rows := the_count.count; 
            RETURN NEXT r; 
        END LOOP; 
        RETURN; 
END;
' LANGUAGE plpgsql; 

Ausführen von select count_em_all(); sollte Ihnen die Zeilenzahl aller Ihrer Tabellen anzeigen.

5voto

Paul Punkte 59

Ich habe eine kleine Abwandlung vorgenommen, um alle Tabellen einzubeziehen, auch für nicht-öffentliche Tabellen.

CREATE TYPE table_count AS (table_schema TEXT,table_name TEXT, num_rows INTEGER); 

CREATE OR REPLACE FUNCTION count_em_all () RETURNS SETOF table_count  AS '
DECLARE 
    the_count RECORD; 
    t_name RECORD; 
    r table_count%ROWTYPE; 

BEGIN
    FOR t_name IN 
        SELECT table_schema,table_name
        FROM information_schema.tables
        where table_schema !=''pg_catalog''
          and table_schema !=''information_schema''
        ORDER BY 1,2
        LOOP
            FOR the_count IN EXECUTE ''SELECT COUNT(*) AS "count" FROM '' || t_name.table_schema||''.''||t_name.table_name
            LOOP 
            END LOOP; 

            r.table_schema := t_name.table_schema;
            r.table_name := t_name.table_name; 
            r.num_rows := the_count.count; 
            RETURN NEXT r; 
        END LOOP; 
        RETURN; 
END;
' LANGUAGE plpgsql; 

verwenden. select count_em_all(); zu nennen.

Ich hoffe, Sie finden dies nützlich. Paul

4voto

user5359531 Punkte 2950

Hier ist eine viel einfachere Methode.

tables="$(echo '\dt' | psql -U "${PGUSER}" | tail -n +4 | head -n-2 | tr -d ' ' | cut -d '|' -f2)"
for table in $tables; do
printf "%s: %s\n" "$table" "$(echo "SELECT COUNT(*) FROM $table;" | psql -U "${PGUSER}" | tail -n +3 | head -n-2 | tr -d ' ')"
done

Die Ausgabe sollte wie folgt aussehen

auth_group: 0
auth_group_permissions: 0
auth_permission: 36
auth_user: 2
auth_user_groups: 0
auth_user_user_permissions: 0
authtoken_token: 2
django_admin_log: 0
django_content_type: 9
django_migrations: 22
django_session: 0
mydata_table1: 9011
mydata_table2: 3499

können Sie die psql -U "${PGUSER}" Teil, der für den Zugriff auf Ihre Datenbank erforderlich ist

beachten Sie, dass die head -n-2 Syntax unter macOS möglicherweise nicht funktioniert, können Sie wahrscheinlich einfach eine andere Implementierung dort

Getestet auf psql (PostgreSQL) 11.2 unter CentOS 7


wenn Sie es nach Tabelle sortiert haben wollen, dann wickeln Sie es einfach mit sort

for table in $tables; do
printf "%s: %s\n" "$table" "$(echo "SELECT COUNT(*) FROM $table;" | psql -U "${PGUSER}" | tail -n +3 | head -n-2 | tr -d ' ')"
done | sort -k 2,2nr

Ausgabe;

mydata_table1: 9011
mydata_table2: 3499
auth_permission: 36
django_migrations: 22
django_content_type: 9
authtoken_token: 2
auth_user: 2
auth_group: 0
auth_group_permissions: 0
auth_user_groups: 0
auth_user_user_permissions: 0
django_admin_log: 0
django_session: 0

1voto

CFreitas Punkte 1537

Ich mag Daniel Vérité's respuesta . Wenn Sie jedoch keine CREATE-Anweisung verwenden können, können Sie entweder eine Bash-Lösung oder, wenn Sie ein Windows-Benutzer sind, ein Powershell-Programm:

# You don't need this if you have pgpass.conf
$env:PGPASSWORD = "userpass"

# Get table list
$tables = & 'C:\Program Files\PostgreSQL\9.4\bin\psql.exe' -U user -w -d dbname -At -c "select table_name from information_schema.tables where table_type='BASE TABLE' AND table_schema='schema1'"

foreach ($table in $tables) {
    & 'C:\path_to_postresql\bin\psql.exe' -U root -w -d dbname -At -c "select '$table', count(*) from $table"
}

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