PostgreSQLLa base de données la plus sophistiquée au monde.

F.21. pg_freespacemap

Le module pg_freespacemap fournit un moyen pour examiner la carte des espaces libres (FSM, acronyme anglais de Free Space Map). Il donne deux fonctions C : pg_freespacemap_relations et pg_freespacemap_pages qui renvoient chacune un ensemble d'enregistrements ainsi que deux vues pg_freespacemap_relations et pg_freespacemap_pages qui emballent les fonctions pour une utilisation agréable.

Par défaut, l'accès publique aux fonctions et vues est interdit, dans le cas où une faille de sécurité traînerait.

F.21.1. Les vues pg_freespacemap

Voici la définition des colonnes fournies par les vues :

Tableau F.23. Colonnes de pg_freespacemap_relations

Nom Type Référence Description
reltablespace oid pg_tablespace.oid OID du tablespace de la relation
reldatabase oid pg_database.oid OID de la base de données contenant cette relation
relfilenode oid pg_class.relfilenode Champ relfilenode de la relation
avgrequest integer   Moyenne de la demande d'espace libre (NULL pour les index)
interestingpages integer   Nombre de pages reportées la dernière fois comme contenant de l'espace libre utile
storedpages integer   Nombre de pages stockées actuellement dans la carte des espaces libres
nextpage integer   Index de la page (en commençant à 0) pour démarrer la prochaine recherche

Tableau F.24. Colonnes de pg_freespacemap_pages

Nom Type Référence Description
reltablespace oid pg_tablespace.oid OID du tablespace de la relation
reldatabase oid pg_database.oid OID de la base de données contenant la relation
relfilenode oid pg_class.relfilenode Champ relfilenode de la relation
relblocknumber bigint   Nombre de pages dans la relation
bytes integer   Octets libres dans la page, ou NULL pour une page d'index (voir ci-dessous)

Pour pg_freespacemap_relations, il existe une ligne pour chaque relation comprise dans la carte des espaces libres. storedpages est le nombre de pages actuellement stockées dans la carte alors que interestingpages est le nombre de pages que le dernier VACUUM pense avoir des quantités utiles d'espace libre.

Si storedpages est très souvent moindre que interestingpages, alors augmenter max_fsm_pages serait une bonne idée. De plus, si le nombre de lignes dans pg_freespacemap_relations est proche de max_fsm_relations, alors vous devez considérer l'augmentation de max_fsm_relations.

Pour pg_freespacemap_pages, il existe une ligne par page dans la carte des espaces libres. Le nombre de lignes pour une relation correspondra au contenu de la colonne storedpages dans pg_freespacemap_relations.

Pour les index, seules des pages entièrement inutilisées sont tracées (plutôt que des espaces libres dans les pages). Du coup, la taille moyenne de la demande et les octets libres dans une page ne sont pas utiles et sont affichés NULL.

Comme la carte est partagé par toutes les bases de données, les entrées correspondant à des relations n'appartenant pas à la base de données courante seront disponibles. Ceci signifie qu'il pourrait y avoir des lignes dont la jointure n'est pas vérifiée avec pg_class pour certaines lignes, ou qu'il pourrait y avoir des jointures incorrectes. Si vous essayez d'établir une jointure avec pg_class, il serait une bonne idée de restreindre cette jointure aux lignes dont reldatabase est égal à l'OID de la base de données actuelle ou à zéro.

Quand une des vues est utilisé, des verrous sont posés sur la carte des espaces libres suffisamment longtemps pour copier toutes les données d'état permettant l'affichage de la vue. Ceci vous assure que l'ensemble des résultats est cohérent tout en ne bloquant pas l'activité normal plus longtemps que nécessaire. Néanmoin, si les vues sont fréquemment lues, cela pourrait avoir un impact sur les performances de la base de données.

F.21.2. Affichage en sortie

regression=# SELECT c.relname, r.avgrequest, r.interestingpages, r.storedpages
             FROM pg_freespacemap_relations r INNER JOIN pg_class c
             ON r.relfilenode = c.relfilenode AND
                r.reldatabase IN (0, (SELECT oid FROM pg_database
                                      WHERE datname = current_database()))
             ORDER BY r.storedpages DESC LIMIT 10;
             relname             | avgrequest | interestingpages | storedpages
---------------------------------+------------+------------------+-------------
 onek                            |        256 |              109 |         109
 pg_attribute                    |        167 |               93 |          93
 pg_class                        |        191 |               49 |          49
 pg_attribute_relid_attnam_index |            |               48 |          48
 onek2                           |        256 |               37 |          37
 pg_depend                       |         95 |               26 |          26
 pg_type                         |        199 |               16 |          16
 pg_rewrite                      |       1011 |               13 |          13
 pg_class_relname_nsp_index      |            |               10 |          10
 pg_proc                         |        302 |                8 |           8
(10 rows)

regression=# SELECT c.relname, p.relblocknumber, p.bytes
             FROM pg_freespacemap_pages p INNER JOIN pg_class c
             ON p.relfilenode = c.relfilenode AND
                p.reldatabase IN (0, (SELECT oid FROM pg_database
                                      WHERE datname = current_database()))
             ORDER BY c.relname LIMIT 10;
   relname    | relblocknumber | bytes
--------------+----------------+-------
 a_star       |              0 |  8040
 abstime_tbl  |              0 |  7908
 aggtest      |              0 |  8008
 altinhoid    |              0 |  8128
 altstartwith |              0 |  8128
 arrtest      |              0 |  7172
 b_star       |              0 |  7976
 box_tbl      |              0 |  7912
 bt_f8_heap   |             54 |  7728
 bt_i4_heap   |             49 |  8008
(10 rows)
  

F.21.3. Auteur

Mark Kirkwood