从架构跟踪表计数

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 的更大嵌套循环。

以上是关于从架构跟踪表计数的主要内容,如果未能解决你的问题,请参考以下文章

超高并发计数系统的架构设计

基于架构的移动项目管理平台设计

从公共架构中撤消特权“创建表”,但不是从定制架构中撤消

跟踪对象字段变化的最佳架构是啥?

日志文件跟踪工具

架构模式: 事务日志跟踪