PostgreSQL jest jedną z najbardziej zaawansowanych baz na świecie, wydajnością dorównuje liderom, jednakże parametry standardowej instalacji raczej nie są zaprojektowane do osiągania największej wydajności.
W celu zwiększenia wydajności na większości współczesnych maszyn należy przeprowadzić zmianę niektórych parametrów. Spośród nich najważniejsze to:
Konfiguracja shared_buffers określa, ile pamięci jest poświęcone dla PostgreSQL do buforowania danych. W większości przypadków, shared_buffers optymalnie będzie ustawić na 1/4 pamięci w systemie. Należy pamiętać, że w systemie Windows, duże wartości shared_buffers nie są tak skuteczne, prawdopodobnie lepsze wyniki można otrzymać utrzymując stosunkowo niskie shared_buffers, pozwalając korzystać z pamięci podręcznej systemu operacyjnego.
Prawdopodobnie należy w ślad za tym ustawieniem zwiększyć ustawienie w systemie operacyjnym kernel.shmmax. W tym celu należy dopisać do /etc/sysctl.conf (256MB - jeżeli w systemie posiadamy 1GB RAM). Więcej o tuningu Linux dla baz danych
$ sysctl -w kernel.shmmax=268435456 $ sysctl -w kernel.shmall=4194304
/etc/postgresql/9.3/postgresql.conf shared_buffers = 196MB
Należy ustawić ile pamięci jest do buforowania dysku pozostałości po uwzględnieniu tego, co jest używane przez system operacyjny, dedykowanej pamięci PostgreSQL, i innych aplikacji. Jeśli jest zbyt niska, indeksy nie mogą być wykorzystywane do wykonywania kwerend w taki sposób jaki można się spodziewać. Ustawianie effective_cache_size do 1/2 całkowitej pamięci jest, z reguły, najbardziej optymalnym ustawieniem. Można lepiej oszacować to ustawienie patrząc na statystyki OS. W systemach uniksowych, dodać należy wartości free + cached z polecenia free.
[root@edokumenty ~]# free total used free shared buffers cached Mem: 1035236 948720 86516 0 11688 761988 -/+ buffers/cache: 175044 860192 Swap: 497972 19040 478932
/etc/postgresql/9.3/postgresql.conf effective_cache_size = 1024MB
W systemie Windows sprawdzić to można Menedżerze zadań na zakładce Wydajność - pole Buforowana.
Work_mem ustawić należy na nieco wyższą wartość niż jest domyślnie, ale należy uważać aby nie przesadzić.
Pamięć ta jest używana głównie do sortowania. Nie jest to wartość maksymalna, zn. tyle ile ustawimy, tyle proces zawsze zarezerwuje. Jeśli ustawimy go na 32MB, i mamy 30 użytkowników to wkrótce obciążenie wzrośnie do ~1GB pamięci rzeczywistej. Jeśli tyle posiadamy w systemie - to OK.
/etc/postgresql/9.3/postgresql.conf work_mem = 32MB