我正在使用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')
答案 0 :(得分:2)
如果您未进行更改,那么您的fillfactor
在桌面上的位置为100%,因为这是默认设置。
这意味着表中的每个更改都会将更改的行标记为过时,并重新创建更新的行。如果您的表上有索引,则问题可能会更加严重,因为索引也应在每行更改时都进行更新。如您所料,这也会损害UPDATE
的效果。
从技术上讲,如果您要读取整个表并在读取行后甚至更新最小的列,那么当fillfactor
为100时,它将使表大小加倍。
您可以做的是ALTER
将桌子上的fillfactor
放下,然后VACUUM
放下:
ALTER TABLE your_table SET (fillfactor = 90);
VACUUM FULL your_table;
当然,通过此步骤,您的表将大约增大10%
,但Postgres将为您的更新保留一些空间,并且不会随着您的进程而改变其大小。
autovacuum之所以有用,是因为它会定期清除过时的行,因此可以使表保持相同的大小。但这给您的数据库带来很大压力。如果您碰巧知道自己将按照开头的问题进行操作,那么我建议您根据需要调整fillfactor
。
答案 1 :(得分:0)
问题在于(source):
“在正常的PostgreSQL操作中,被更新删除或过时的元组不会从表中物理删除”
此外,我们并不总是关闭游标,这也会在运行时增加数据库的大小。
最后一个问题是我们正在运行一个庞大的查询,不允许系统正确地自动清空。 here
详细描述了此问题。我们的解决方案是重新解决该问题,以便不必更新行。我们可能想到但尚未尝试的其他解决方案是,每隔一段时间停止一次该过程,以使自动真空正常工作。
答案 2 :(得分:-1)
添加数据是什么意思?所有的数据文件?专门针对某些文件?
要获得准确的答案,您应该提供更多详细信息,但是通常来说,任何数据库操作都会将数据添加到事务日志中,并可能添加其他文件。