从模式

时间:2017-03-24 19:17:41

标签: sql postgresql

我使用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来将此日期发送到跟踪器表。有任何建议如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

在阅读代码之前请考虑一下:

  1. 而不是选择多个子查询,如果您可以将它们加入一个qry,例如select (select 1 from t), (select 2 from t)可以重构为select 1,2 from t
  2. pg_total_relation_size是数据页的总和,因此它是表的大小,但不是数据的大小。
  3. 您需要在created_dttm列上进行聚合(我使用oid代替),否则您的子查询会返回多行,因此您将无法插入结果。
  4. 而不是select count(*)可能会使用pg_stat_all_tables个统计数据?计数可能非常昂贵,并且计数的精确度()会因下一分钟相同的选择计数()而被忽略em>)会有所不同,你可能不会每两秒运行一次......
  5. 代码:

    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)