Documentation PostgreSQL 8.3.23 > Annexes > Modules supplémentaires fournis > pg_freespacemap | |
pgcrypto | pgrowlocks |
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.
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.
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)
Mark Kirkwood <markir@paradise.net.nz>