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.

18voto

Raju Sah Punkte 507

Einfach in zwei Schritten:
(Hinweis: Sie brauchen nichts zu ändern - einfach kopieren und einfügen)
1. Funktion erstellen

create function 
cnt_rows(schema text, tablename text) returns integer
as
$body$
declare
  result integer;
  query varchar;
begin
  query := 'SELECT count(1) FROM ' || schema || '.' || tablename;
  execute query into result;
  return result;
end;
$body$
language plpgsql;

2. Führen Sie diese Abfrage aus, um die Anzahl der Zeilen für alle Tabellen zu erhalten

select sum(cnt_rows) as total_no_of_rows from (select 
  cnt_rows(table_schema, table_name)
from information_schema.tables
where 
  table_schema not in ('pg_catalog', 'information_schema') 
  and table_type='BASE TABLE') as subq;

ou

Um die Anzahl der Zeilen tabellenweise zu ermitteln

select
  table_schema,
  table_name, 
  cnt_rows(table_schema, table_name)
from information_schema.tables
where 
  table_schema not in ('pg_catalog', 'information_schema') 
  and table_type='BASE TABLE'
order by 3 desc;

14voto

estani Punkte 20703

Aus meinem Kommentar in der Antwort von GregSmith herausgenommen, um ihn besser lesbar zu machen:

with tbl as (
  SELECT table_schema,table_name 
  FROM information_schema.tables
  WHERE table_name not like 'pg_%' AND table_schema IN ('public')
)
SELECT 
  table_schema, 
  table_name, 
  (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 tbl ORDER BY 3 DESC;

Dank an @a_horse_with_no_name

12voto

Stew-au Punkte 424

Nicht sicher, ob eine Antwort in der Bash für Sie akzeptabel ist, aber FWIW...

PGCOMMAND=" psql -h localhost -U fred -d mydb -At -c \"
            SELECT   table_name
            FROM     information_schema.tables
            WHERE    table_type='BASE TABLE'
            AND      table_schema='public'
            \""
TABLENAMES=$(export PGPASSWORD=test; eval "$PGCOMMAND")

for TABLENAME in $TABLENAMES; do
    PGCOMMAND=" psql -h localhost -U fred -d mydb -At -c \"
                SELECT   '$TABLENAME',
                         count(*) 
                FROM     $TABLENAME
                \""
    eval "$PGCOMMAND"
done

10voto

Yuri Levinsky Punkte 1469

Normalerweise verlasse ich mich nicht auf Statistiken, insbesondere nicht in PostgreSQL.

SELECT table_name, dsql2('select count(*) from '||table_name) as rownum
FROM information_schema.tables
WHERE table_type='BASE TABLE'
    AND table_schema='livescreen'
ORDER BY 2 DESC;

CREATE OR REPLACE FUNCTION dsql2(i_text text)
  RETURNS int AS
$BODY$
Declare
  v_val int;
BEGIN
  execute i_text into v_val;
  return v_val;
END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

10voto

Pradeep Maurya Punkte 334

Das hat bei mir funktioniert

SELECT schemaname,relname,n_live_tup FROM pg_stat_user_tables ORDER BY n_live_tup DESC;

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