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 个表中检索数据? 那么当下一个ANALYZE
或VACUUM
运行时,该数字将再次设置。以上是关于Postgres 检查是不是插入了任何新行的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一个 Postgres 11 触发器函数,该函数在插入或更新到表“a”时在表“b”中插入一个新行?
PHP:每 10 秒检查一次 mysql 数据库是不是有任何新行
检查 CollectionViewSource 中的行是不是是新行