С помощью этого запроса вы получаете доступ к статистике базы данных, которая не является на 100% точной и может отсутствовать или устареть в зависимости от ваших процессов сбора статистики.
Чтобы получить количество строк для списка таблиц, вы должны просмотреть каждую из этих таблиц. Однако вы можете использовать pg_relation_size()
, чтобы получить представление о размере таблицы в байтах, и эта функция не требует сканирования таблицы.
Если ваш список таблиц статичен, вы можете обойтись без такого запроса:
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;
Это решение не является гибким, так как если список таблиц изменился, вам нужно переписать запрос.
Второй вариант — сгенерировать этот запрос и выполнить его вручную:
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;
Это более гибко, однако второй запрос следует выполнять вручную.
И, наконец, ваш последний вариант - написание функции для этого:
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);
person
0x0FFF
schedule
26.05.2016