AWS数据库单列添加极多数据

AWS database single column adds extremely much data

我正在使用 PgAdmin 从 AWS 数据库中检索数据。这很好用。问题是我有一个列在检索到相应的行后设置为 True,最初它被设置为 Null。这样做会向我的数据库添加大量数据。

我检查过这不是其他进程造成的:只有当我的程序是 运行 时才会发生。 我确定没有添加任何行,我检查了前后的行数,它们是相同的。

此外,它仅在更改特定 table 时执行此操作,当我使用相同进程更新同一数据库中的其他 table 时,数据库大小保持不变。它也不总是增加数据库的大小,只有每次更改一次总大小才会增加。

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

我正在使用以下命令检查我的数据库构成:

获得table尺寸

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')

添加数据是什么意思?到所有的数据文件?专门针对某些文件?

要获得准确的答案,您应该提供更多详细信息,但一般来说,任何数据库操作都会将数据添加到事务日志,可能还有其他文件。

问题是 (source):

"In normal PostgreSQL operation, tuples that are deleted or obsoleted by an update are not physically removed from their table"

此外,我们并不总是关闭游标,这也会增加数据库大小,同时 运行。

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

我们的解决方案是重新解决问题,这样行就不必更新了。我们可以想到但没有尝试过的其他解决方案是每隔一段时间停止一次该过程,以允许 autovacuum 正常工作。

如果您没有更改,那么您的 fillfactor 在 table 上为 100%,因为这是默认设置。

这意味着您 table 中的每个更改都会将更改的行标记为已过时并重新创建更新的行。如果您的 table 上有索引,问题可能会更糟,因为这些索引也应该在每一行更改时更新。正如您想象的那样,这也会损害 UPDATE 性能。

所以从技术上讲,如果您阅读整个 table 并在阅读行后更新甚至最小的列,那么当您的 fillfactor 为 100 时,它会将 table 大小加倍。

你可以做的是 ALTER 你的 table 降低它上面的 fillfactor,然后 VACUUM 它:

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

当然,通过这一步,您的 table 将大约 10% 变大,但 Postgres 会保留一些 space 用于您的更新,并且它不会随着您的进程改变其大小。

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