Documentation PostgreSQL 8.1.23 > Référence > Commandes SQL > CLUSTER | |
CLOSE | COMMENT |
CLUSTER nomindex ON nomtable CLUSTER nomtable CLUSTER
CLUSTER réorganise (regroupe) la table nomtable en fonction de l'index nomindex. L'index doit avoir été préalablement défini sur nomtable.
Une table regroupée est physiquement réordonnée en fonction des informations de l'index. Ce regroupement est une opération unique : les modifications issues de mises à jour postérieures au groupage ne sont pas réorganisées. C'est-à-dire qu'aucune tentative n'est réalisée pour stocker les données nouvelles ou mises à jour d'après l'ordre de l'index. Une réorganisation périodique peut être obtenue en relançant la commande aussi souvent que souhaité.
Quand une table est groupée, PostgreSQL™ enregistre l'index qui a servi à la réorganisation. La forme CLUSTER nomtable regroupe la table suivant ce même index.
CLUSTER, sans paramètre, groupe toutes les tables de la base de données courante 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 regroupement, un verrou ACCESS EXCLUSIVE est acquis. Cela empêche toute opération sur la table (à la fois en lecture et en écriture) pendant l'exécution de CLUSTER.
Le nom d'un index.
Le nom d'une table (éventuellement qualifié du nom du schéma).
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.
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 groupe, 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 se montre utile. En effet, lorsque l'index identifie la page principale (heap page) pour la première ligne correspondante, toutes les autres lignes correspondantes sont déjà probablement sur la même page, 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, un espace libre sur le disque au moins égal à la somme de la taille de la table et celles des index est nécessaire.
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 façon d'un VACUUM. Les tables sont ainsi régulièrement regroupées.
Comme le planificateur enregistre les statistiques d'ordonnancement des tables, il est conseillé de lancer ANALYZE sur la table 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 grouper les données. En effet, la commande CLUSTER réorganise la table originale en utilisant l'ordre de l'index spécifié ;.cela peut devenir lent sur les grandes tables parce que les lignes sont parcourues en mémoire dans l'ordre de l'index et, si la table n'est pas ordonnée, les entrées sont disséminées dans 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 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é ; 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. ALTER TABLE ... RENAME est utilisé pour renommer nouvelletable en table. Il ne reste plus qu'à recréer les index de la table. Toutefois, cette approche 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.