Top 10 suggerimenti per ottimizzare le prestazioni di PostgreSQL per database ad alte prestazioni

PostgreSQL è noto per la sua robustezza e flessibilità, ma per ottenere il massimo da esso in ambienti ad alto traffico o ad alta intensità di dati, è essenziale ottimizzarlo. Questa guida illustra suggerimenti chiave per ottimizzare le prestazioni di PostgreSQL che gli amministratori di database e gli sviluppatori possono utilizzare.

Suggerimenti Chiave per l’Ottimizzazione

1. Configurazione della Memoria

Buffer Condivisi

Il parametro shared_buffers di PostgreSQL controlla la quantità di memoria utilizzata per la memorizzazione nella cache. Impostalo su circa il 25-40% della memoria totale del sistema, ma evita sovra-allocare, poiché il sistema operativo ha bisogno di memoria anche per la memorizzazione dei file.

Riferimento: Documentazione dei Buffer Condivisi di PostgreSQL

Plain Text

 

shared_buffers = 1GB  # Set to 25-40% of system memory

Memoria di Lavoro

Per query complesse o ordinamenti, il parametro work_mem definisce la quantità di memoria che ogni connessione può utilizzare per le operazioni delle query. Aumenta questo valore per migliori prestazioni con set di dati più grandi, ma fai attenzione: questa memoria è allocata per ogni query, quindi aumentarla troppo potrebbe esaurire la memoria disponibile.

Riferimento: Documentazione della Memoria di Lavoro di PostgreSQL

Plain Text

 

work_mem = 16MB  # Adjust based on workload

2. Dimensione della Cache Effettiva

Questa è un’impostazione importante per la pianificazione delle query, poiché PostgreSQL utilizza effective_cache_size per stimare quanta memoria è disponibile per la memorizzazione nella cache del disco. Impostalo a circa il 75% della memoria totale del sistema.

Riferimento: Documentazione sulla Dimensione Efficace della Cache di PostgreSQL

Plain Text

 

effective_cache_size = 3GB

3. Impostazioni del Checkpoint

Regolare le impostazioni del checkpoint può aiutare a ridurre il carico di I/O del disco e migliorare le prestazioni durante periodi di elevata attività di scrittura. Considera di regolare checkpoint_timeout e checkpoint_completion_target.

Riferimento: Documentazione sulle Impostazioni del Checkpoint di PostgreSQL

Plain Text

 

checkpoint_timeout = 15min  # Adjust based on workload
checkpoint_completion_target = 0.7  # Set to balance write load

4. Ottimizzazione dell’Autovacuum

Autovacuum è fondamentale per prevenire la dilatazione delle tabelle. Regolare le impostazioni di autovacuum aiuta a mantenere le prestazioni del database nel tempo.
Riferimento: Documentazione sull’Autovacuum di PostgreSQL

Plain Text

 

autovacuum_vacuum_threshold = 50

autovacuum_analyze_threshold = 50

Adatta queste impostazioni in base alle dimensioni e al livello di attività delle tue tabelle.

5. Pianificazione delle Query con EXPLAIN e ANALYZE

Le funzionalità EXPLAIN e ANALYZE di PostgreSQL ti consentono di capire come vengono eseguite le query. Utilizza questi comandi per individuare i colli di bottiglia e ottimizzare le query che impiegano troppo tempo.

Riferimento: Documentazione di PostgreSQL EXPLAIN

Plain Text

 

EXPLAIN ANALYZE SELECT * FROM my_table WHERE condition;

6. Pooling delle connessioni

Per i sistemi che gestiscono un gran numero di connessioni simultanee, l’utilizzo di uno strumento di pooling delle connessioni come PgBouncer può ridurre notevolmente l’overhead. Ciò aiuta PostgreSQL a gestire efficientemente le risorse.

Riferimento: Documentazione di PgBouncer

Plain Text

 

pgbouncer.ini  # Example configuration for PgBouncer

7. Partizionamento di Tabelle Voluminose

Il partizionamento è uno strumento potente per ottimizzare le query su tabelle voluminose. Suddividendo una grande tabella in partizioni più piccole, PostgreSQL può elaborare le query più rapidamente.

Riferimento: Documentazione sul Partizionamento di PostgreSQL

SQL

 

CREATE TABLE measurement (

    city_id         int,

    logdate         date,

    peaktemp        int,

    unitsales       int

) PARTITION BY RANGE (logdate);

8. Migliori Pratiche per l’Indicizzazione

Usa gli indici saggiamente. Un eccesso di indicizzazione può causare degrado delle prestazioni durante la scrittura, ma un’indicizzazione corretta migliora significativamente le prestazioni delle query.

Riferimento: Documentazione sugli Indici di PostgreSQL

SQL

 

CREATE INDEX idx_measurement_logdate ON measurement (logdate);

9. Esecuzione di Query in Parallelo

Sfrutta l’esecuzione in parallelo delle query di PostgreSQL per velocizzare le prestazioni delle query sui sistemi multi-core. Regola max_parallel_workers e max_parallel_workers_per_gather per abilitare questa funzionalità.

Riferimento: Documentazione sulle Query Parallele di PostgreSQL

Plain Text

 

max_parallel_workers = 8
max_parallel_workers_per_gather = 4

10. Registrazione e Monitoraggio

Monitora i log di PostgreSQL per identificare i colli di bottiglia delle prestazioni. Abilita la registrazione per le query a lunga durata.

Riferimento: Documentazione sul Logging di PostgreSQL

Plain Text

 

log_min_duration_statement = 500ms  # Log queries that take more than 500ms

Utilizza strumenti come pg_stat_statements per monitorare le prestazioni delle query e identificare quali query necessitano di ottimizzazione.

Conclusioni

Questi consigli per l’ottimizzazione forniscono una base solida per migliorare le prestazioni di PostgreSQL. Regolando le impostazioni di memoria, utilizzando autovacuum e sfruttando l’esecuzione in parallelo, puoi assicurarti che il tuo database PostgreSQL funzioni in modo ottimale, anche sotto carichi pesanti. Non dimenticare di monitorare regolarmente le tue metriche di prestazione per mantenere il sistema in esecuzione in modo fluido.

Source:
https://dzone.com/articles/top-10-postgresql-tuning-tips-for-high-performance