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

时间:2018-11-09 15:26:26

标签: postgresql amazon-web-services amazon-rds pgadmin

我正在使用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')

3 个答案:

答案 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)

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

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