【问题标题】: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

【问题讨论】:

    标签: database postgresql count postgresql-9.4


    【解决方案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 运行时,该数字将再次设置。
    猜你喜欢
    • 2015-03-07
    • 2012-12-06
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多