postgresql – AWS数据库单列添加了极多的数据

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

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

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

如何将单个布尔值从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')

最佳答案 如果您没有更改,那么您的
fillfactor在表上是100%,因为这是默认值.

这意味着表中的每个更改都会将更改的行标记为过时,并将重新创建更新的行.如果您的表上有索引,那么问题可能会更糟,因为每行都应更新这些索引.你可以想象这也会伤害UPDATE的性能.

所以从技术上讲,如果你读完整个表并在读取行后更新最小的列,那么当你的fillfactor为100时,它会使表的大小加倍.

你可以做的是改变你的表,降低它上面的fillfactor,然后VACUUM:

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

当然,通过这一步,您的桌子将大约增加10%,但Postgres将为您的更新留出一些空间,并且不会随着您的过程改变其大小.

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

点赞