small table occupies many relpages - Mailing list pgsql-admin

From Markus Bertheau
Subject small table occupies many relpages
Date
Msg-id 1068200182.2191.15.camel@silizium.cenes-intern.de
Whole thread Raw
Responses Re: small table occupies many relpages
List pgsql-admin
Hi,

we log access log data to a PostgreSQL 7.3.4 database. There is this
small table virtual_domains

access_logs2=# \d virtual_domains
                                        Table "public.virtual_domains"
      Column       |  Type   |                                   Modifiers
-------------------+---------+--------------------------------------------------------------------------------
 virtual_domain_id | integer | not null default nextval('public.virtual_domains_virtual_domain_id_seq'::text)
 virtual_domain    | text    |
Indexes: virtual_domains_pkey primary key btree (virtual_domain_id),
         virtual_domains_virtual_domain_key unique btree (virtual_domain)


It has a unique index on virtual_domain. Every day we do <10000 queries
of the form

insert into virtual_domains values (default, 'www.something.de')

to make sure www.something.de has an entry in virtual_domains. The table
virtual_domains does in fact contain only 4 records. The whole database
is vacuumed through pg_autovacuum (with its default parameters). We're
observing a steady growth of the relpages virtual_domains occupies:

access_logs2=# analyze virtual_domains ;
ANALYZE
access_logs2=# select relname, relpages from pg_class where relname like 'virtual_domains%';
                relname                | relpages
---------------------------------------+----------
 virtual_domains                       |      207
 virtual_domains_pkey                  |      257
 virtual_domains_virtual_domain_id_seq |        1
 virtual_domains_virtual_domain_key    |        2
(4 rows)

207 is pretty much for a table with 4 records :). We can fix that by running vacuum full:

access_logs2=# vacuum full verbose  analyze virtual_domains;
INFO:  --Relation public.virtual_domains--
INFO:  Pages 207: Changed 2, reaped 207, Empty 0, New 0; Tup 4: Vac 32191, Keep/VTL 0/0, UnUsed 1, MinLen 48, MaxLen
55;Re-using: Free/Avail. Space 1562616/7340; EndEmpty/Avail. Pages 206/1. 
        CPU 0.00s/0.01u sec elapsed 0.00 sec.
INFO:  Index virtual_domains_pkey: Pages 354; Tuples 4: Deleted 32191.
        CPU 0.02s/0.16u sec elapsed 0.93 sec.
INFO:  Index virtual_domains_virtual_domain_key: Pages 2; Tuples 4: Deleted 1.
        CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO:  Rel virtual_domains: Pages: 207 --> 1; Tuple(s) moved: 0.
        CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO:  --Relation pg_toast.pg_toast_6130614--
INFO:  Pages 0: Changed 0, reaped 0, Empty 0, New 0; Tup 0: Vac 0, Keep/VTL 0/0, UnUsed 0, MinLen 0, MaxLen 0;
Re-using:Free/Avail. Space 0/0; EndEmpty/Avail. Pages 0/0. 
        CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO:  Index pg_toast_6130614_index: Pages 1; Tuples 0.
        CPU 0.00s/0.00u sec elapsed 0.03 sec.
INFO:  Analyzing public.virtual_domains
VACUUM
access_logs2=# select relname, relpages from pg_class where relname like 'virtual_domains%';
                relname                | relpages
---------------------------------------+----------
 virtual_domains                       |        1
 virtual_domains_pkey                  |      354
 virtual_domains_virtual_domain_id_seq |        1
 virtual_domains_virtual_domain_key    |        2
(4 rows)

The fsm settings are as follows:

max_fsm_relations = 2000        # min 10, fsm is free space map, ~40 bytes
max_fsm_pages = 2000000         # min 1000, fsm is free space map, ~6 bytes

The big table size slows down sequential scans significantly. What can
we do to prevent growth of the table? Are the fsm settings appropriate?
Why does the index on the primary key grow?

Thanks

--
Markus Bertheau <twanger@bluetwanger.de>


pgsql-admin by date:

Previous
From: Oli Sennhauser
Date:
Subject: Re: close connection
Next
From: Antonis Antoniou
Date:
Subject: Re: vacuum full problem