根据 20 个最大的表显示最后 last_autovacuum/anaylze 等

show last last_autovacuum/anaylze etc based on the 20 biggest tables

我正在尝试监控我们的 postgresql 数据库并确定 20 个最大的表,然后查看最后一次清理和分析发生的时间。

我有这个查询,显示了最大的 20 个模式 name/relname,这很好,这就是我要找的:

SELECT schema_name, relname, pg_size_pretty(table_size) AS size, table_size 
FROM ( SELECT pg_catalog.pg_namespace.nspname  AS schema_name,relname, 
pg_relation_size(pg_catalog.pg_class.oid) AS table_size FROM 
pg_catalog.pg_class JOIN pg_catalog.pg_namespace ON relnamespace = 
pg_catalog.pg_namespace.oid ) t WHERE schema_name NOT LIKE 'pg_%' ORDER BY 
table_size DESC LIMIT 20;

我也有这个查询,它显示了我想用架构名称和 relname 查看的所有分析:

select relname, schemaname, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze from pg_stat_user_tables;

但我真的很难将它们组合到一个查询中,该查询将显示仅针对那 20 个表的分析。

一旦完成,我希望在 datadog 中以某种图形视图查看结果,所以如果有人知道如何 运行 此查询作为 datadog posgres 查询,它将也很棒

如果有人需要答案,我就是这样做的。 它显示了过去 2 周内未最后清理的最大 tables,但将列表限制为 20 个结果。

如果您愿意,可以更改 LIMIT 20 或删除 shorter/longer 列表。还要更改 pg.last_autovacuum 以进行分析或从 pg.stat table 中更改任何您想要检查的内容,并且 2 周可以更改为您想要的任何时间段。

SELECT t.nspname || '.' || t.relname AS "relation", size, count(DISTINCT t.relname)
from (SELECT nspname, relname, pg_size_pretty(pg_relation_size(C.oid)) AS "size"
      FROM pg_class C
         LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
      WHERE nspname NOT IN ('pg_catalog', 'information_schema')
      ORDER BY pg_relation_size(C.oid) DESC
      LIMIT 20) t
       left join pg_stat_user_tables pg on pg.relname = t.relname
where pg.last_autovacuum < now() - interval '2 week'
group by relation, size;

在 postgres.yaml 下的 datadog 中,我添加了这个:

custom_metrics:
- # Last Auto vacuum tables
  query: SELECT t.nspname || '.' || t.relname AS "relation", size, %s from (SELECT nspname , relname , pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON ( N.oid = C.relnamespace) WHERE nspname NOT IN ('pg_catalog', 'information_schema') ORDER BY pg_relation_size(C.oid) DESC LIMIT 20) t left join pg_stat_user_tables pg on pg.relname = t.relname where pg.last_autovacuum < now() - interval '2 week' group by relation, size;
  metrics:
      count(DISTINCT t.relname) last_autovacuum: [postgresql.last_autovacuum, GAUGE]
  relation: false
  descriptors:
      - [relation, relation]
      - [size, size]

然后我将其添加为仪表板内的顶级列表。您还可以将其作为警报并总结指标内的计数并决定您想要开始清理的限制是多少,尽管它只是建议定期 运行 它,而不仅仅是当它太大时,这就是为什么我们仅将其用作仪表板中的列表。只为得到眼睛。