Vous n'êtes pas identifié(e).

#1 11/04/2017 16:44:06

[RESOLU] l'option FREEZE de VACUUM

Salut
Je voudrais comprendre l'action de l'option FREEZE de VACUUM.
Je viens de lire...

FREEZE: l'identifiant de la ligne est passé à une valeur spéciale “toujours visible”

dans ce document (page 12) et je ne comprend pas le sens.
Merci d'avance.

Dernière modification par alassanediakite (12/04/2017 17:29:53)

Hors ligne

#2 12/04/2017 07:58:52

gleu
Administrateur

Re : [RESOLU] l'option FREEZE de VACUUM

En même temps, des slides, ça n'aide pas à comprendre. C'est forcément très succinct.

Bon, va falloir s'accrocher...

Chaque ligne d'une table contient les colonnes utilisateurs et les colonnes systèmes. Parmi les colonnes systèmes, il existe une colonne indiquant par quel numéro de transaction une ligne a été créée et par quel numéro de transaction elle a été supprimée. Pour faire très (très très très) schématique, une ligne est considérée visible par une transaction si elle a été créée avant la transaction en cours et si elle n'a pas été supprimée. Le numéro de transaction est un entier sur 4 octets, donc avec un maximum de 4 milliards de valeurs. Or, sur les systèmes actuels, il est facile de dépasser 4 milliards de valeurs. Donc si on ne fait qu'incrémenter l'identifiant, on va finir par atteindre la valeur maximale. Si on l'atteint, on a deux possibilités : soit on arrête le système (pas bon), soit on revient à 0. Mais si on revient à 0, l'identifiant de transaction courant devient antérieur à tous les identifiants enregistrés au niveau des lignes, ce qui fait qu'aucune ligne n'est visible. C'est pas bon non plus. Il faut donc que l'identifiant de la transaction la plus ancienne ne soit pas toujours 0, mais un identifiant qui change suivant le rythme des modifications effectuées sur l'instance. Donc PostgreSQL utilise les identifiants de façon cyclique mais pour cela, il doit avoir un pointeur sur l'identifiant le plus ancien. Et pour cela, il faut que les identifiants enregistrés au niveau des lignes ne restent pas sur leur valeur initiale. À partir du moment où une ligne est considérée comme visible par tout le monde, son identifiant de création doit être remplacé par un identifiant constant qui n'est pas pris en compte dans la comparaison. Il s'appelle le FrozenXid et l'opération qui permet le remplacement de l'identifiant s'appelle un Freeze. VACUUM est chargé de cette opération. Il peut le faire automatiquement suivant la configuration des paramètres *freeze* ou on peut le forcer à le faire en utilisant l'option FREEZE de VACUUM (ou de COPY sur les dernières versions de PostgreSQL).


Guillaume.

Hors ligne

#3 12/04/2017 17:29:21

Re : [RESOLU] l'option FREEZE de VACUUM

Salut
Merci gleu, c'est très claire
@+

Hors ligne

Pied de page des forums