从架构跟踪表计数
Posted
技术标签:
【中文标题】从架构跟踪表计数【英文标题】:Track table counts from a schema 【发布时间】:2017-03-24 19:17:40 【问题描述】:我使用 postgres,我需要你们所有 PG 专家的帮助... 我希望从大量源表中跟踪计数,这些表的计数每天都在变化。我想在跟踪器表中使用表名、行数和表大小,以及一个名为 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 来将此日期获取到跟踪器表。有什么建议可以解决这个问题吗?
【问题讨论】:
您需要检查的表列表是静态的,还是您的流程需要考虑进入/删除的新表? 感谢您的回复,表格列表是静态的 您可以简单地为每个表编写相同的查询。不过,更好的方法仍然是您需要使用动态 SQL。我要做的是创建一个函数来传递表名并动态执行您需要的查询。然后,您只需在每个表上静态调用所述函数,或者查询 nformation_schema.tables (如果您的表列表不是静态的,则必须执行此操作。此外,此答案对可能相关的问题进行了一些讨论你:***.com/questions/32210193/… 非常有趣!我需要挖掘相应的 postgres sql 表示法。我明白你的意思了。我可以对特定表进行多项选择并获取计数。我正在寻找一种方法来获取表列表的循环,然后运行查询以填充到跟踪器。我不想插入值'table1',选择...然后插入'table2',选择..单独填充表名字段 这种有你提到的:***.com/questions/24618672/…记住,你只能在postgres的PG/PGSQL函数中做动态sql。 【参考方案1】:在阅读代码之前,请考虑以下几点:
-
而不是选择几个子查询,如果你可以将它们加入一个qry,例如
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
stats?.. 计数可能非常昂贵,并且计数的准确性()被忽略,因为下一分钟相同的选择计数()将是不同的,你可能不会每两秒运行一次这个计数......
代码:
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)
【讨论】:
谢谢,你提出了非常有趣的观点。我认为循环结构接近我所需要的,尽管您的回答并没有完全回答我的问题。我需要通过时间戳找到表的计数。一个表将有 N 个时间戳,我想要所有这些时间戳的计数,以及所有表 M 的更大嵌套循环。以上是关于从架构跟踪表计数的主要内容,如果未能解决你的问题,请参考以下文章