Sie greifen mit dieser Abfrage auf Datenbankstatistiken zu, die nicht zu 100% genau sind und abhängig von Ihren statistischen Erfassungsprozessen möglicherweise fehlen oder veraltet sind.
Um die Zeilenanzahl für eine Liste von Tabellen zu erhalten, müssen Sie jede dieser Tabellen scannen. Sie können jedoch pg_relation_size()
verwenden, um eine Vorstellung von der Tabellengröße in Bytes zu erhalten, und diese Funktion erfordert nicht das Scannen der Tabelle.
Wenn Ihre Tabelle Liste statisch ist, können Sie mit einer Abfrage wie folgt wegkommen:
select 'table1', count(*), max(time) from table1
union all
select 'table2', count(*), max(time) from table2
union all
...
select 'table52', count(*), max(time) from table52;
Diese Lösung nicht flexibel ist, als ob Tabellenliste geändert hat, können Sie Ihre Abfrage neu schreiben müssen.
Zweite Option ist diese Abfrage zu generieren und manuell ausführen:
select string_agg(query, ' union all ') as query
from (
select 'select ''' || n.nspname || '.' || c.relname || ''', count(*), max(time) from ' || n.nspname || '.' || c.relname as query
from pg_namespace as n, pg_class as c
where n.oid = c.relnamespace
and n.nspname = 'my_schema'
) as q;
Dies ist flexibler, aber die zweite Abfrage sollte manuell ausgeführt werden.
Und schließlich die letzte Option - eine Funktion für das Tun so zu schreiben:
create or replace function table_sizes (schemaname varchar) returns setof record as $BODY$
declare
r record;
t varchar;
begin
for t in execute $$
select n.nspname || '.' || c.relname
from pg_namespace as n, pg_class as c
where n.oid = c.relnamespace
and c.relkind = 'r'
and n.nspname = '$$ || schemaname || $$'$$
loop
execute 'select ''' || t || '''::varchar, count(*), max(time) from ' || t
into r;
return next r;
end loop;
return;
end;
$BODY$ language plpgsql volatile;
select * from table_sizes('public') t(tablename varchar, rowcount bigint, maxtime time);
Hallo vickps Welches Zeitstempelformat verwendest du mit Eg Zeit mit oder ohne Zeitzone? – pnorton
Zeitstempel ohne Zeitzone – NEO