我使用postgres,我需要你们所有PG专家的帮助...... 我希望从大量源表中跟踪计数,这些源表的计数每天都在变化。我想在跟踪器表中使用tablename,row count和tablesize,以及一个名为created_dttm的列来显示从源表记录此行计数的时间。这是用于趋势表的计数如何随时间变化并寻找峰值。
insert into tracker_table( tablename, rowcount, tablesize, timestamp)
from
(
(select schema.tablename ... - not sure how to drive this to pick up a list of tables??
, select count(*) from schema.tablename
, SELECT pg_size_pretty(pg_total_relation_size('"schema"."tablename"'))
, select created_dttm from schema.tablename
)
);
此外,我想从源表中获取第四列的特定列。这将是源表中的created_dttm时间戳字段,我想运行一个简单的SQL来将此日期发送到跟踪器表。有任何建议如何解决这个问题?
答案 0 :(得分:1)
在阅读代码之前请考虑一下:
select (select 1 from t), (select 2 from t)
可以重构为select 1,2 from t
pg_total_relation_size
是数据页的总和,因此它是表的大小,但不是数据的大小。created_dttm
列上进行聚合(我使用oid代替),否则您的子查询会返回多行,因此您将无法插入结果。select count(*)
可能会使用pg_stat_all_tables
个统计数据?计数可能非常昂贵,并且计数的精确度()会因下一分钟相同的选择计数(>)而被忽略em>)会有所不同,你可能不会每两秒运行一次...... 代码:
t=# create table so30 (n text, c int, s text, o int);
CREATE TABLE
t=# do
$$
declare
_r record;
_s text;
begin
for _r in (values('pg_database'),('pg_roles')) loop
_s := format('select %1$L,(select count(*) from %1$I), (SELECT pg_size_pretty(pg_total_relation_size(%1$L))), (select max(oid) from %1$I)',_r.column1);
execute format('insert into so30 %s',_s);
end loop;
end;
$$
;
DO
t=# select * from so30;
n | c | s | o
-------------+---+---------+-------
pg_database | 4 | 72 kB | 16384
pg_roles | 2 | 0 bytes | 4200
(2 rows)