您使用此查询访问的是数据库统计信息,它不是 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);