Le module pg_buffercache fournit un moyen pour
  examiner ce qui se passe dans le cache partagé en temps réel.
  Il offre aussi une façon bas niveau de supprimer des données du cache,
  pour des tests.
 
  Ce module fournit la fonction pg_buffercache_pages()
  (utilisée dans la vue pg_buffercache),
  la fonction pg_buffercache_summary(), la fonction
  pg_buffercache_usage_counts() et la fonction
  pg_buffercache_evict().
 
  La fonction pg_buffercache_pages() renvoie un ensemble
  d'enregistrements, chaque ligne décrivant l'état d'une entrée du cache disque.
  La vue pg_buffercache intègre la fonction pour une
  utilisation plus simple.
 
  La fonction pg_buffercache_summary() renvoie une seule
  ligne résumant l'état du cache disque.
 
  La fonction pg_buffercache_usage_counts() renvoie un
  ensemble d'enregistrements, chaque ligne décrivant le nombre de tampons
  pour un décompte d'utilisation donné.
 
  Par défaut, l'utilisation des fonctions ci-dessus est restreinte aux
  superutilisateurs et aux rôles
  disposant des attributs du rôle pg_monitor. L'accès peut
  être accordé à d'autres rôle en utilisant GRANT.
 
  La fonction pg_buffercache_evict() permet de supprimer
  un bloc du cache disque d'après son identifiant. L'utilisation de cette
  fonction est réservée aux superutilisateurs.
 
pg_buffercache #Voici la définition des colonnes exposées par la vue affichée dans Tableau F.14 :
Tableau F.14. Colonnes de pg_buffercache
Type de la colonne Description  | 
|---|
         
        ID, qui va de 1 à   | 
         Numéro filenode de la relation  | 
         OID du tablespace de la relation  | 
         OID de la base de données de la relation  | 
         
        Numéro du fork dans la relation ; voir
          | 
         Numéro de page dans la relation  | 
         Page modifiée ?  | 
         Compteur d'accès clock-sweep  | 
         Nombre de processus serveur en accès sur ce bloc  | 
   Il y a une ligne pour chaque tampon dans le cache partagé. Les tampons
   inutilisés sont affichés avec des champs NULL sauf pour
   bufferid. Les catalogues systèmes partagés sont
   affichés comme appartenant à la base de données zéro.
  
   Comme le cache est partagé par toutes les bases de données, il y aura
   des pages de relations n'appartenant pas à la base de données courante.
   Cela signifie qu'il pourrait y avoir des lignes sans correspondance dans
   pg_class, ou qu'il pourrait y avoir des jointures
   incorrectes. Si vous essayez une jointure avec
   pg_class, une bonne idée est de restreindre la
   jointure aux lignes ayant un reldatabase égal
   à l'OID de la base de données actuelle ou à zéro.
  
   Comme des verrous du gestionnaire de tampons ne sont pas acquis pour copier
   les données d'état du tampon que la vue affichera, accéder à la vue
   pg_buffercache a moins d'impact sur l'activité
   normale du tampon, mais il ne fournit pas un ensemble cohérent de résultats
   sur tous les tampons. Néanmoins, nous nous assurons que l'information de
   chaque tampon est cohérente avec lui-même.
  
pg_buffercache_summary() #Les définitions des colonnes exposées par la fonction sont affichées dans Tableau F.15.
Tableau F.15. Colonnes en sortie de pg_buffercache_summary()
Type de colonne Description  | 
|---|
        Nombre de tampons utilisés  | 
        Nombre de tampons inutilisés  | 
        Nombres de tampons modifiés  | 
        Nombre de tampons verrouillés  | 
        Décompte moyen d'utilisation des tampons  | 
   La fonction pg_buffercache_summary() renvoie une seule
   ligne résumant l'état de tous les tampons partagés. Une information similaire
   bien que plus détaillée est fournie par la vue
   pg_buffercache mais
   pg_buffercache_summary() est plus performante.
  
   Tout comme la vue pg_buffercache,
   pg_buffercache_summary() n'acquiert pas de verrous
   dans le gestionnaire de tampons. Donc une activité concurrente peut
   amener des inexactitudes mineuses dans le résultat.
  
pg_buffercache_usage_counts() #Les définitions des colonnes exposées par la fonction sont affichées dans Tableau F.16.
Tableau F.16. Colonnes en sortie de pg_buffercache_usage_counts()
Type de colonne Description  | 
|---|
        Décompte d'utilisation des tampons  | 
        Nombre de tampons pour ce décompte  | 
        Nombre de tampons modifiés pour ce décompte  | 
        Nombre de tampons verrouillés pour ce décompte  | 
   La fonction pg_buffercache_usage_counts() renvoie un
   ensemble de lignes résumant les états des tampons partagés, agrégés sur
   les valeurs possibles du décompte. Une information similaire mais plus
   détaillée est fournie par la vue pg_buffercache
   mais la fonction pg_buffercache_usage_counts() est
   plus performante.
  
   Tout comme la vue pg_buffercache, la fonction
   pg_buffercache_usage_counts() n'acquiert pas de verrous
   par le gestionnaire de tampons. De ce fait, l'activité concurrente peut
   amener à des inexactitudes mineures dans le résultat.
  
pg_buffercache_evict #
   La fonction pg_buffercache_evict() prend en entrée
   un identifiant de buffer, comme indiqué par la colonne
   bufferid de la vue
   pg_buffercache. Elle renvoie true en cas de succès,
   et faux si l'identifiant n'est pas valide, s'il n'a pas pu être supprimé
   car il était utilisé, ou s'il a été modifié après une tentative d'écriture.
   Le résultat est immédiatement obsolète à son retour car le buffer pourrait
   être de nouveau valide dû à l'activité concurrente. La fonction est
   proposée uniquement pour des tests de développement.
  
  regression=# SELECT n.nspname, c.relname, count(*) AS buffers
               FROM pg_buffercache b JOIN pg_class c
               ON b.relfilenode = pg_relation_filenode(c.oid) AND
                  b.reldatabase IN (0, (SELECT oid FROM pg_database
                                        WHERE datname = current_database()))
               JOIN pg_namespace n ON n.oid = c.relnamespace
               GROUP BY n.nspname, c.relname
               ORDER BY 3 DESC
               LIMIT 10;
  nspname   |        relname         | buffers
------------+------------------------+---------
 public     | delete_test_table      |     593
 public     | delete_test_table_pkey |     494
 pg_catalog | pg_attribute           |     472
 public     | quad_poly_tbl          |     353
 public     | tenk2                  |     349
 public     | tenk1                  |     349
 public     | gin_test_idx           |     306
 pg_catalog | pg_largeobject         |     206
 public     | gin_test_tbl           |     188
 public     | spgist_text_tbl        |     182
  (10 rows)
regression=# SELECT * FROM pg_buffercache_summary();
 buffers_used | buffers_unused | buffers_dirty | buffers_pinned | usagecount_avg
--------------+----------------+---------------+----------------+----------------
          248 |        2096904 |            39 |              0 |       3.141129
(1 row)
regression=# SELECT * FROM pg_buffercache_usage_counts();
 usage_count | buffers | dirty | pinned
-------------+---------+-------+--------
           0 |   14650 |     0 |      0
           1 |    1436 |   671 |      0
           2 |     102 |    88 |      0
           3 |      23 |    21 |      0
           4 |       9 |     7 |      0
           5 |     164 |   106 |      0
(6 rows)
  
   Mark Kirkwood <markir@paradise.net.nz>
  
   Suggestions de conception : Neil Conway <neilc@samurai.com>
  
   Conseils pour le débogage : Tom Lane <tgl@sss.pgh.pa.us>