Hi All,

Maybe some questions are quite newbie ones, and I did try hard to scan 
all the articles and documentation, but I did not find a satisfying 
answer.

I'm running PostgreSQL 8.3.6 on a 32-Bit Centos 4 machine (which I 
probably should update to 64 Bit soon)


I have some tables which tend to get huge (and will for sure hit the 
wall of my storage system soon, total DB ~700 GB now):

SELECT relfilenode, relpages,reltuples,relname FROM pg_class WHERE 
relpages > 10000 ORDER BY relpages DESC;
 relfilenode | relpages |  reltuples  |             relname
-------------+----------+-------------+---------------------------------
-
       72693 | 51308246 | 4.46436e+09 | result_orig
       72711 | 17871658 | 6.15227e+06 | test
       73113 | 12240806 | 4.46436e+09 | result_orig_test_id
       73112 | 12240806 | 4.46436e+09 | result_orig_prt_id
       72717 |   118408 | 6.15241e+06 | test_orig
       72775 |    26489 | 6.15241e+06 | test_orig_lt_id
       72755 |    19865 | 6.15241e+06 | test_orig_test_id_key
       73147 |    16872 | 6.15227e+06 | test_test_id
       73146 |    16872 | 6.15227e+06 | test_lt_id


I'm going to work on the table size of the largest table (result_orig) 
itself by eliminating columns, stuffing n Booleans into bit(n)'s, 
replacing double precision by reals, etc.. By this I should be able to 
reduce the storage per row to ~1/3 of the bytes currently used.

I have the same information stored in an Oracle 10g DB which consumes 
only 70G data and 2G for indexes. The schema may be better optimized, 
but for sure there is a table with 4 billion rows inside as well. So 
it's about 10x smaller in disk space than PgSQL. I wonder why.

But still:

### My Issue No. 1: Index Size
What really worries me is the size of the two largest indexes 
(result_orig_test_id, result_orig_prt_id) I'm using. Both are roughly 
1/3 of the result_orig table size and each index only b-tree indexes a 
single bigint column (prt_id, test_id) of result_orig. Roughly every 
group of 100 rows of result_orig have the same prt_id, roughly every 
group of 1000-10000 rows have the same test_id.  Each of these two cols 
is a Foreign Key (ON DELETE CASCADE).

So my fear is now, even if I can reduce the amount of data per row in 
result_orig, my indexes will remain as large as before and then dominate 
disk usage.

Is such disk usage for indexes expected? What can I do to optimize? I 
could not run yet a VACUUM on result_orig, as I hit into max_fsm_pages 
limit (still trying to adjust that one). I tried REINDEX, it didn't 
change anything.


### My Issue No. 2: relpages and VACUUM
I have another table "test" which is - as starting point - created by 
INSERTs and then UPDATE'd. It has the same columns and roughly the same 
number of rows as table test_orig,  but consumes 160 times the number of 
pages. I tried VACUUM on this table but it did not change anything on 
its relpages count. Maybe this is just because VACUUM without FULL does 
not re-claim disk space, i.e. relpages stays as it is? I did observe 
that after VACUUM, a REINDEX on this table did considerably shrink down 
the size of its indexes (test_test_id, test_lt_id). 


### My Issue No 3: VACCUM FULL out of memory
I tried to do a VACCUM FULL on the two tables (test, result_orig) 
mentioned above. In both cases it fails with a very low number on out of 
memory like this:

ERROR:  out of memory
DETAIL:  Failed on request of size 224.

I use these kernel settings:
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 2147483648
vm.overcommit_memory = 2

And these postgresql.conf settings:
shared_buffers = 512MB                  # min 128kB or 
max_connections*16kB
temp_buffers = 128MB                    # min 800kB
max_prepared_transactions = 1024        # can be 0 or more
work_mem = 16MB                         # min 64kB
maintenance_work_mem = 256MB            # min 1MB
max_stack_depth = 8MB                   # min 100kB
max_fsm_pages = 70000000                # min max_fsm_relations*16, 6 
bytes each
max_fsm_relations = 4194304             # min 100, ~70 bytes each
#max_files_per_process = 1000           # min 25
#shared_preload_libraries = ''          # (change requires restart)

What's going wrong here? I know, one should not use VACUUM FULL, but I 
was curious to see if this would have any impact on relpages count 
mentioned in Issue 2. 


###My Issue No. 4: Autovacuum
I have the feeling that Autovacuum is not really running, else why are 
tables and indexes growing that much, especially "test" table?
 
#-----------------------------------------------------------------------
-------
# AUTOVACUUM PARAMETERS
#-----------------------------------------------------------------------
-------

autovacuum = on                         # Enable autovacuum subprocess?  
'on'
log_autovacuum_min_duration = 1000      # -1 disables, 0 logs all 
actions and
autovacuum_max_workers = 3              # max number of autovacuum 
subprocesses
autovacuum_naptime = 1min               # time between autovacuum runs
autovacuum_vacuum_threshold = 50        # min number of row updates 
before
autovacuum_analyze_threshold = 50       # min number of row updates 
before
autovacuum_vacuum_scale_factor = 0.2    # fraction of table size before 
vacuum
autovacuum_analyze_scale_factor = 0.1   # fraction of table size before 
analyze
autovacuum_freeze_max_age = 200000000   # maximum XID age before forced 
vacuum
autovacuum_vacuum_cost_delay = 20       # default vacuum cost delay for
autovacuum_vacuum_cost_limit = -1       # default vacuum cost limit for

How would I check it is running correctly? I don't see any error 
messages in syslog from autovacuum.



Any help, also on tuning postgresql.conf to this application, is greatly 
appreciated!

Thanks

Andy




-- 
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance

Reply via email to