Blog about PostgreSQL and other things
Here are a couple of tips to boost the performance of a PostgreSQL database server. For I/O scheduler and kernel/sysctl tuning, see the Linux - Kernel settings page.
If one model has a constantly updated section and a rarely updated section (like a user record with a name and a last-seen-on-site field), split those 2 into 2 tables. This allows to the lock taken at tuple level and reinforces the read on the second field. The tuple of the field read a lot might be locked a lot die to the other field being continuously updated so you can really improve performance here.
A good index has a high selectivity on commonly-performed queries or is required to enforce a constraint. A bad index is everything else: non-selective, rarely used, expensive to maintain. Only the first column of a multi-column index can be used separately.
So…
If autovacuum is slowing down the system, increase autovacuum_vacuum_cost_limit. If load is periodic, do manual VACUUM instead at low times. Do not forget that you must VACUUM regularly.
Analyze collects statistics on the data to help the planner choose a good plan. This is done automatically as a part of autovacuum. You should always do it manually after substantial database changes (loads, etc.), and also do it as part of any VACUUM process done manually.
stats_temp_directory is a directory where temporary statistics are stored, and they do not need to persist. pg_stat_tmp is the default. Its size is usually a couple of hundred kilobytes. Here is how to set a ramdisk for that.
Create the ramdisk partition.
mkdir -p $TEMP_STAT_FOLDER
chmod 777 $TEMP_STAT_FOLDER
chmod +t $TEMP_STAT_FOLDER
Add new partition to /etc/fstab with a new dedicated entry:
tmpfs $TEMP_STAT_FOLDER tmpfs size=2M,uid=$USER,gid=$GROUP 0 0
In postgresql.conf, add that, and then reload it:
stats_temp_directory = '$TEMP_STAT_FOLDER'
Unless otherwise specified, the contents of this website are (C)Copyright Michael Paquier 2010-2026 and are licensed for use under CC BY-NC-ND 4.0.