Documentation PostgreSQL 9.5.25 > Référence > Commandes SQL > CLUSTER | |
CLOSE | COMMENT |
CLUSTER — Réorganiser une table en fonction d'un index
CLUSTER [VERBOSE] nom_table [ USING nom_index ] CLUSTER [VERBOSE]
CLUSTER réorganise (groupe) la table nom_table en fonction de l'index nom_index. L'index doit avoir été préalablement défini sur nom_table.
Une table reorganisée est physiquement réordonnée en fonction des informations de l'index. Ce regroupement est une opération ponctuelle : les actualisations ultérieures ne sont pas réorganisées. C'est-à-dire qu'aucune tentative n'est réalisée pour stocker les lignes nouvelles ou actualisées 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é. De plus, configurer le paramètre FILLFACTOR à moins de 100% peut aider à préserver l'ordre du cluster lors des mises à jour car les lignes mises à jour sont conservées dans la même page si suffisamment d'espace est disponible ici.)
Quand une table est réorganisée, PostgreSQL™ enregistre l'index utilisé à cet effet. La forme CLUSTER nom_table réorganise la table en utilisant le même index qu'auparavant. Vous pouvez aussi utiliser les formes CLUSTER ou SET WITHOUT CLUSTER de ALTER TABLE(7) pour initialiser l'index de façon à ce qu'il soit intégré aux prochaines opérations cluster ou pour supprimer tout précédent paramètre.
CLUSTER, sans paramètre, réorganise toutes les tables de la base de données courante qui ont déjà été réorganisées et dont l'utilisateur est propriétaire, ou toutes les tables s'il s'agit d'un superutilisateur. Cette forme de CLUSTER ne peut pas être exécutée à l'intérieur d'une transaction.
Quand une table est en cours de réorganisation, 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'une table (éventuellement qualifié du nom du schéma).
Le nom d'un index.
Affiche la progression pour chaque table traitée.
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.
CLUSTER peut trier de nouveau en utilisant soit un parcours de l'index spécifié soit (si l'index est un Btree) un parcours séquentiel suivi d'un tri. Il choisira la méthode qui lui semble la plus rapide, en se basant sur les paramètres de coût du planificateur et sur les statistiques disponibles.
Quand un parcours d'index est utilisé, une copie temporaire de la table est créée. Elle contient les données de la table dans l'ordre de l'index. Des copies temporaires de chaque index sur la table sont aussi créées. Du coup, vous devez disposer d'un espace libre sur le disque d'une taille au moins égale à la somme de la taille de la table et des index.
Quand un parcours séquentiel suivi d'un tri est utilisé, un fichier de tri temporaire est aussi créé. Donc l'espace temporaire requis correspond à au maximum le double de la taille de la table et des index. Cette méthode est généralement plus rapide que le parcours d'index mais si le besoin en espace disque est trop important, vous pouvez désactiver ce choix en désactivant temporairement enable_sort (off).
Il est conseillé de configurer maintenance_work_mem à une valeur suffisamment large (mais pas plus importante que la quantité de mémoire que vous pouvez dédier à l'opération CLUSTER) avant de lancer la commande.
Puisque le planificateur enregistre les statistiques d'ordonnancement des tables, il est conseillé de lancer ANALYZE(7) sur la table nouvellement réorganisée. Dans le cas contraire, les plans de requêtes peuvent être mal choisis par le planificateur.
Comme CLUSTER se rappelle les index utilisés pour cette opération, un utilisateur peut exécuter manuellement des commandes CLUSTER une première fois, puis configurer un script de maintenance périodique qui n'exécutera qu'un CLUSTER sans paramètres, pour que les tables soient fréquemment triées physiquement.
Réorganiser la table employes sur la base de son index employes_ind :
CLUSTER employes ON employes_ind;
Réorganiser la relation employes en utilisant le même index que précédemment :
CLUSTER employes;
Réorganiser toutes les tables de la base de données qui ont déjà été préalablement réorganisées :
CLUSTER;