为什么autovacuum进程无法恢复内存

Pav*_*mar 2 database postgresql memory-management database-performance

我只是经历了一个场景,我根本没有得到我的问题的线索.

我有一个名为name的表(列名和时间).该表每隔一分钟插入许多行.并且这些插入的记录将在特定时间间隔内删除.所以,最后我停止插入数据并删除了表中的所有行.

我的数据库版本细节

impss=# SELECT  version();
                                           version                                            
----------------------------------------------------------------------------------------------
 PostgreSQL 8.3.7 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2
(1 row)
Run Code Online (Sandbox Code Playgroud)

但是当我发出查询以查找表的大小时,我仍然得到一些大小.

impss=# SELECT  pg_size_pretty( pg_total_relation_size('names')) ;
 pg_size_pretty 
----------------
 1504 kB
(1 row)
Run Code Online (Sandbox Code Playgroud)

第一个问题为什么它仍然显示一些大小虽然我删除了表中的所有记录.

要查找上次autovacuum何时完成,我已发出以下查询:

当前时间是

impss=# select now(); 
               now                
----------------------------------
 2012-11-08 20:21:10.550434+05:30
(1 row)

impss=# SELECT last_autovacuum  from pg_stat_user_tables where relname='names';
         last_autovacuum          
----------------------------------
 2012-11-08 17:51:31.995618+05:30
Run Code Online (Sandbox Code Playgroud)

第二个问题:为什么在此之后没有执行autovacuum进程,尽管我的数据库不是繁忙的,我已经停止了对该表的所有事务.

所以,请告诉我是否必须进行任何特定配置才能进行频繁的真空处理,以便在记录被删除后我可以取回所有空间.

Pav*_*ule 6

第一个查询 - autovacuum不会调用VACUUM FULL - 因此它对关系大小没有影响(通常,但是当真空执行时没有其他请求访问关系时,它可以修剪从最终到最后生存元组的关系文件) ,第二个查询 - autovacuum在autovacuum_vacuum_threshold行被修改并且修改后的行/所有行高于autovacuum_vacuum_scale_factor时执行.这两个值都在postgresql.conf中,默认值为50行和20%.

Autovacuum执行不依赖于当前的数据库负载 - 它仅取决于更新/删除的行数.