pg_buffercache

Una utile estensione di PostgreSQL e' pg_buffercache che consente di controllare lo stato della buffer cache di PostgreSQL.
Il dettaglio delle informazioni ottenute e' notevole ma la vista e' abbastanza pesante, sopratutto per le istanze che hanno una buffer cache di grandi dimensioni, quindi pg_buffercache va utilizzata con cautela.

L'estensione pg_buffercache e' comunque utile ed andrebbe configurata negli ambienti PostgreSQL di produzione per poter eseguire controlli periodici della cache... quindi continuate a leggere!

Introduzione

Con Postgres non si hanno molti strumenti per analizzare e gestire il contenuto della buffer cache del database.
Per colmare questa lacuna e' stata introdotta l'estensione pg_buffercache che consente di monitorare lo stato di ogni singolo buffer della cache.

Configurando questa estensione sono disponibili tutti i dettagli...

Configurazione

pg_buffercache generalmente non richiede alcuna installazione perche' fa parte delle core extensions. Non richiede alcuna configurazione ma, naturalmente, va creata l'extension in ogni database in cui deve essere utilizzata. Vediamo i dettagli...

Basta lanciare il seguente comando creare le viste di sistema necessarie:
 create extension pg_buffercache;

Gia' fatto!

Utilizzo

Una volta attivata l'estensione pg_buffercache risultano disponibili [NdA potenzialmente soggetto a collisioni ma e' caso quasi impossibile].

Le statistiche raccolte dal modulo vengono riportate nella system view pg_buffercache che puo' essere normalmente interrogata con una select SQL. Per ottenere le relazioni che occupano di piu' la memoria:

SELECT c.relname, c.relkind, count(*) as buffers, pg_size_pretty(count(*) * 8192) as buffered, round(100.0 * count(*)/(SELECT setting FROM pg_settings WHERE name='shared_buffers')::integer,1) as buffers_pct, round(100.0 * count(*) * 8192 / pg_relation_size(c.oid),1) as relation_pct, round(avg(usagecount),2) as usage_avg FROM pg_class c INNER JOIN pg_buffercache b ON b.relfilenode = c.relfilenode INNER JOIN pg_database d ON (b.reldatabase = d.oid AND d.datname = current_database()) WHERE pg_relation_size(c.oid) > 0 GROUP BY c.oid, c.relname, c.relkind ORDER BY 3 DESC LIMIT 30;

Per valutare la dimensione minima della cache:

SELECT pg_size_pretty(setting::bigint*8192::bigint) as buffer_cache_size FROM pg_settings WHERE name='shared_buffers'; SELECT pg_size_pretty(count(*) * 8192) as minimal_cache_size_est FROM pg_buffercache WHERE usagecount >= 3;

Nel tempo sono state aggiunte nuove viste e funzioni, dalla versione 16 e' possibile utilizza queste query:

select * from pg_buffercache_summary(); select * from pg_buffercache_usage_counts();

Storia

L'estensione pg_buffercache e' stata introdotta con la 8.1 (2005) ed e' sempre stata mantenuta, con alcune utili estensioni, ad ogni nuova release di PostgreSQL.

Alcuni degli aggiornamenti piu' significativi:

Maggiori dettagli si trovano nella utilissima pgPedia.

Varie ed eventuali

La vista pg_buffercache e' creata nello schema public quando viene creata l'extension.

Come sempre la documentazione ufficiale PostgreSQL riporta tutti i dettagli...


Titolo: pg_buffercache
Livello: Intermedio (2/5)
Data: 31 Ottobre 2025 🎃
Versione: 1.0.1 - 14 Febbraio 2026 ❤️
Autore: mail [AT] meo.bogliolo.name