代码之家  ›  专栏  ›  技术社区  ›  Nathan

AWS数据库单列添加了大量数据

  •  4
  • Nathan  · 技术社区  · 7 年前

    我已经检查过,这不是由于其他进程:它只发生在我的程序运行时。 我确定没有添加任何行,我检查了前后的行数,它们是相同的。

    将单个布尔值从Null更改为True如何为我的数据库添加0.1 MB?

    获取表格大小

    SELECT
        relname as Table,
        pg_total_relation_size(relid) As Size,
        pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as External Size
    FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;
    

    SELECT schemaname,relname,n_live_tup 
      FROM pg_stat_user_tables 
      ORDER BY n_live_tup DESC;
    

    SELECT pg_database_size('mydatabasename')
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   KARASZI István    7 年前

    fillfactor 是100%,因为这是默认值。

    这意味着表中的每个更改都会将更改的行标记为过时,并重新创建更新的行。如果表中有索引,问题可能会更糟,因为这些索引也应该在每一行更改时更新。你可以想象这会伤害到 UPDATE 表现也不错。

    所以从技术上讲,如果您读取整个表,并且在读取行之后更新最小的列,那么当您的 填满因子 是100。

    你能做的就是 ALTER 你的桌子放低一点 填满因子 那就在上面 VACUUM 信息技术:

    ALTER TABLE your_table SET (fillfactor = 90);
    VACUUM FULL your_table;
    

    当然,这一步你的桌子就会 10%

    autovacuum之所以有帮助,是因为它会定期清理过时的行,因此它会使您的表保持相同的大小。但是它给你的数据库带来了很大的压力。如果您碰巧知道您将执行在开始问题中描述的操作,那么我建议您调整 为了你的需要。

        2
  •  0
  •   Nathan    7 年前

    问题是( source

    在正常的PostgreSQL操作中,被更新删除或废弃的元组不会从表中物理删除

    最后一个问题是,我们运行了一个巨大的查询,不允许系统正确地自动抽真空。这个问题将被更详细地描述 here

    我们的解决方案是重新处理问题,这样就不必更新行。我们可以想到但还没有尝试过的其他解决方案是,每隔一段时间就停止这个过程,让自动真空正常工作。

        3
  •  -1
  •   Ophir Yoktan    7 年前

    添加数据是什么意思?所有的数据文件?特别是一些文件?

    为了得到准确的答案,您应该提供更多的细节,但一般来说,任何DB操作都会将数据添加到事务日志中,也可能添加到其他文件中。