CLUSTER

Nom

CLUSTER -- réorganise une table suivant un index

Synopsis

CLUSTER nomindex ON nomtable
CLUSTER nomtable
CLUSTER

Description

CLUSTER demande à PostgreSQL de réorganiser (regrouper) la table spécifiée par nomtable en se basant sur l'index spécifié par nomindex. L'index doit déjà avoir été défini sur nomtable.

Quand une table est réorganisée, elle est physiquement réordonnée en se basant sur les informations de l'index. Ce groupement est une opération unique : quand une table est mise à jour après coup, les modifications ne tiennent pas compte de la réorganisation. C'est-à-dire qu'aucune tentative n'est réalisée pour stocker les nouvelles données ou les données mises à jour suivant l'ordre de l'index. Si vous le souhaitez, vous pouvez grouper périodiquement en lançant de nouveau la commande.

Quand une table est groupée, PostgreSQL se rappelle de l'index avec lequel elle a été réorganisée. La forme CLUSTER nomtable groupe de nouveau la table avec le même index qu'auparavant.

CLUSTER sans aucun paramètre groupe toutes les tables de la base de données courante et dont l'utilisateur est propriétaire, ou toutes les tables s'il s'agit d'un superutilisateur. (Les tables qui n'ont jamais été groupées sont ignorées.) Cette forme de CLUSTER ne peut pas être appelée à partir d'une transaction ou d'une fonction.

Quand une table est en cours de groupement, un verrou ACCESS EXCLUSIVE est acquis. Ceci empêche toute opération sur la table (à la fois en lecture et en écriture) tant que la commande CLUSTER n'est pas terminée.

Paramètres

nomindex

Le nom d'un index.

nomtable

Le nom d'une table (pouvant être qualifié du nom du schéma).

Notes

CLUSTER perd toute visibilité des lignes, ce qui fait que la table semble vide à toute image de la base prise avant la fin de la commande CLUSTER. Les applications ayant des transactions accèdant à une table en cours de clusterisation peuvent donc difficilement utiliser la commande CLUSTER. L'impact est encore plus important avec les transactions sérialisables car elles prennent seulement une image de la base, au début de la transaction. Cela étant dit, les transactions « read-committed » sont aussi affectées.

Dans les cas où vous accédez aux lignes d'une table de façon aléatoire, et une par une, l'ordre réel des données dans la table n'est pas important. Néanmoins, si vous avez tendance à accéder à certaines données plus qu'à d'autres et qu'il existe un index qui les groupe ensemble, vous bénéficierez de l'utilisation de CLUSTER. Si vous demandez un ensemble de valeurs indexées à partir d'une table, ou une seule valeur indexée correspondant à plusieurs lignes, CLUSTER vous aidera car une fois que l'index a identifié la page principale pour la première ligne correspondante, toutes les autres lignes correspondantes sont déjà probablement sur la même page et vous économisez du coup des accès disque et accélérez ainsi la requête.

Lors de l'opération de réorganisation, une copie temporaire de la table est créée pour contenir les données de la table dans l'ordre de l'index. Des copies temporaires de chaque index de la table sont aussi créées. Du coup, vous avez besoin d'un espace libre sur le disque au moins égal à la somme de la taille de la table et des tailles des index.

Comme CLUSTER se rappelle des informations de réorganisation, vous pouvez réorganiser les tables que vous voulez la première fois manuellement et planifier régulièrement une réorganisation de la même façon que vous faites un VACUUM de façon à ce que les tables soient périodiquement groupées de nouveau.

Comme le planificateur enregistre les statistiques des enregistrements suivant l'ordre des tables, il est conseillé de lancer ANALYZE sur la table réorganisée. Sinon, le planificateur pourrait faire de mauvais choix pour les plans de requêtes.

Il existe une autre façon de grouper les données. La commande CLUSTER réordonne la table originale en utilisant l'ordre de l'index que vous spécifiez. Ceci peut être lent sur les grandes tables parce que les lignes sont récupérées dans l'ordre de l'index et que si la table n'est pas ordonnée, les entrées sont dans des pages aléatoires, donc il y a une page disque lue pour chaque ligne déplacée. (PostgreSQL a un cache mais la totalité d'une grande table ne tiendra pas dans le cache.) L'autre moyen de réorganiser une table est d'utiliser

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

qui utilise le code de tri de PostgreSQL dans la clause ORDER BY pour créer l'ordre désiré ; ceci est généralement bien plus rapide qu'un parcours d'index pour des données non triées. Vous pouvez alors supprimer l'ancienne table, utiliser ALTER TABLE ... RENAME pour renommer nouvelletable par l'ancien nom et recréer les index de la table. Néanmoins, cette approche ne préserve pas les OID, les contraintes, les relations de clés étrangères, les droits donnés et d'autres propriétés de la table --- tous ces éléments devront être recréés manuellement.

Exemples

Grouper la table employes sur la base de son index emp_ind :

CLUSTER emp_ind ON emp;

Grouper la relation employes en utilisant le même index qu'auparavant :

CLUSTER emp;

Grouper toutes les tables de la base de données qui ont déjà été groupées :

CLUSTER;

Compatibilité

Il n'existe pas d'instruction CLUSTER dans le standard SQL.

Voir aussi

clusterdb