Postgres 检查是不是插入了任何新行

Posted

技术标签:

【中文标题】Postgres 检查是不是插入了任何新行【英文标题】:Postgres check if any new rows were insertedPostgres 检查是否插入了任何新行 【发布时间】:2019-02-05 10:36:48 【问题描述】:

我有许多相当大的表(300-400 个表,每个约 3000 万行)。每天(每天一次)我必须检查是否有任何新行插入到这些表中。可能插入的行数可能从 0 到 3000 万行不等。不会删除行。

目前,我使用近似计数检查是否插入了任何新行。然后将其与之前(昨天)的结果进行比较。

SELECT reltuples FROM pg_class WHERE oid='tablename'::regclass;

我怀疑的主要问题是:如果插入 3000 行(或插入 5 行),reltuples 多久会更新?对于这种情况,近似计数是一个好的解决方案吗?

我的配置参数是:

autovacuum_analyze_threshold: 50
autovacuum_analyze_scale_factor: 0.1

【问题讨论】:

【参考方案1】:

reltuples 将在 VACUUM (ir autovacuum) 运行时更新,因此该数字通常有 20% 的误差范围。

您可以从表统计视图中更好地估计表中的行数:

SELECT n_live_tup
FROM pg_stat_user_tables
WHERE schemaname = 'myschema' AND relname = 'mytable';

此数字由统计收集器更新,因此不能保证 100% 准确(涉及 UDP 套接字),并且可能需要一段时间才能看到数据修改的效果。

但它通常比reltuples 更准确。

【讨论】:

但是如果统计数据被重置会发生什么?我必须从所有 300 个表中检索数据? 那么当下一个ANALYZEVACUUM 运行时,该数字将再次设置。

以上是关于Postgres 检查是不是插入了任何新行的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个 Postgres 11 触发器函数,该函数在插入或更新到表“a”时在表“b”中插入一个新行?

PHP:每 10 秒检查一次 mysql 数据库是不是有任何新行

检查 CollectionViewSource 中的行是不是是新行

检查 postgresql 的返回查询中是不是存在值

n_live_tup 和 n_dead_tup 的变化是不是意味着一些新行被插入到表中

惯用/快速 Django ORM 检查 mysql/postgres 上是不是存在