IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Synopsis

CLUSTER nomindex ON nomtable
CLUSTER nomtable
CLUSTER

Notes

CLUSTER supprime toute information de visibilité des lignes, ce qui donne l'impression, à tout instantané de la base pris avant la fin de la commande CLUSTER , que la table est vide. CLUSTER est de ce fait incompatible avec les applications dont certaines transactions accèdent concurrentiellement à la table en cours de réorganisation (clusterisation). L'impact est encore plus important avec les transactions sérialisables car elles ne prennent un instantané de la base qu'au début de la transaction. Cela dit, les transactions « read-committed » sont aussi affectées.

Lorsque les lignes d'une table sont accédées aléatoirement et unitairement, l'ordre réel des données dans la table n'a que peu d'importance. Toutefois, si certaines données sont plus accédées que d'autres, et qu'un index les regroupe, l'utilisation de CLUSTER peut s'avérer bénéfique. Si une requête porte sur un ensemble de valeurs indexées ou sur une seule valeur pour laquelle plusieurs lignes de la table correspondent, CLUSTER est utile. En effet, lorsque l'index identifie la page de la table pour la première ligne correspondante, toutes les autres lignes correspondantes sont déjà probablement sur la même page de table, ce qui diminue les accès disque et accélère la requête.

Lors de l'opération de réorganisation, une copie temporaire de la table est créée qui contient les données de la table dans l'ordre de l'index. Des copies temporaires de chaque index de la table sont également créées. De ce fait, il est nécessaire de disposer d'un espace libre sur le disque au moins égal à la somme de la taille de la table et celles des index.

Puisque CLUSTER enregistre les informations de réorganisation, il est possible de réorganiser manuellement les tables souhaitées la première fois et de planifier une réorganisation, à la manière de VACUUM , pour que les tables soient régulièrement réorganisées.

Puisque le planificateur enregistre les statistiques d'ordonnancement des tables, il est conseillé de lancer ANALYZE sur la table nouvellement réorganisée. Dans le cas contraire, les plans de requêtes peuvent être mal choisis par le planificateur.

Il existe une autre façon de réorganiser les données. La commande CLUSTER réorganise la table originale en la parcourant en fonction de l'ordre de l'index indiqué ; cela peut être lent pour les tables volumineuses parce que les lignes sont extraites de la table dans l'ordre de l'index et, si la table n'est pas ordonnée, les entrées sont disséminées sur des pages aléatoires. Une page disque est alors lue pour chaque ligne déplacée. (PostgreSQL™ dispose d'un cache mais une grande table n'y tient généralement pas dans sa totalité.) L'autre moyen de réorganiser une table est alors d'utiliser

CREATE TABLE nouvelletable AS
    SELECT * FROM table ORDER BY listecolonnes;

qui utilise le code de tri de PostgreSQL™ pour aboutir à l'ordre désiré ; pour des données non triées, cela est généralement bien plus rapide qu'un parcours d'index. L'ancienne table peut alors être supprimée et nouvelletable renommée en table à l'aide de ALTER TABLE ... RENAME . Il ne reste plus qu'à recréer les index de la table. Le gros inconvénient de cette approche est qu'elle ne préserve pas les OID, les contraintes, les relations de clés étrangères, les droits et autres propriétés de la table -- tous ces éléments doivent être recréés manuellement. Un autre inconvénient est la nécessité d'un fichier temporaire de tri de la même taille que la table elle-même. Le pic d'utilisation du disque est alors d'environ trois fois la taille de la table au lieu de deux fois.