Le module pg_prewarm
fournit un moyen pratique
de charger des données des relations dans le cache de données du système
d'exploitation ou dans le cache de données de
PostgreSQL.
pg_prewarm(regclass, mode text default 'buffer', fork text default 'main', first_block int8 default null, last_block int8 default null) RETURNS int8
Le premier argument est la relation qui doit être préchargée. Le
second est la méthode de préchargement à utiliser,
comme décrit plus bas. Le troisième argument correspond au type de
fichier à précharger (généralement main
). Le quatrième
argument est le numéro du premier bloc à précharger
(NULL
est accepté comme synonyme de zéro). Le cinquième
argument correspond au dernier numéro de bloc à précharger
(NULL
signifie que l'on précharge jusqu'au dernier bloc
dans la relation). La valeur retournée correspond au nombre de blocs
préchargés.
Il y a trois méthodes de préchargement disponibles.
prefetch
envoie une requête de prélecture asynchrone au
système d'exploitation si celui-ci le supporte ou sinon renvoie une erreur.
read
lit l'intervalle de blocs demandé. Contrairement à
prefetch
, toutes les plateformes et options de compilation
le supportent, mais cette méthode peut être plus lente.
buffer
lit l'intervalle de blocs demandé pour le charger
dans le cache de données de la base.
Il est à noter qu'avec n'importe laquelle de ces méthodes, tenter de
précharger plus de blocs qu'il n'est possible de mettre en cache -- par
le système d'exploitation en utilisant prefetch
ou
read
, ou par PostgreSQL en
utilisant buffer
-- aura probablement pour effet
d'expulser du cache les blocs de numéro inférieur au fur et à mesure que
les blocs de numéros supérieurs seront lus. De plus, les données
préchargées ne bénéficient d'aucune protection spécifique contre l'éviction
du cache. Il est donc possible que d'autres activités du
système d'exploitation puissent évincer du cache les données fraîchement
préchargées peu après leur lecture. Pour toutes ces
raisons, le préchargement est typiquement plus utile au démarrage, quand
les caches sont majoritairement vides.
Robert Haas <rhaas@postgresql.org>