CLUSTER |
Unité d'allocation |
PostgreSQL |
Syntaxe
CLUSTER [VERBOSE] table_name [ USING index_name ]
|
CLUSTER [VERBOSE]
|
Paramètres
Nom |
Description |
table_name |
Ce paramètre permet d'indiquer le nom (éventuellement qualifié de schéma) d'une table. |
index_name |
Ce paramètre permet d'indiquer le nom d'un index. |
VERBOSE |
Ce paramètre permet d'afficher un rapport de progression au fur et à mesure que chaque table est regroupée. |
Description
Cette instruction permet de regrouper une table selon un index.
Remarques
- L'instruction CLUSTER demande à PostgreSQL de regrouper la table spécifiée par table_name en fonction de l'index spécifié par index_name. L'index doit déjà avoir été défini
sur table_name.
- Lorsqu'une table est regroupée, elle est physiquement réorganisée en fonction des informations d'index. L'unité d'allocation est une opération unique : lorsque la table est mise à jour par la suite,
les modifications ne sont pas regroupées. C'est-à-dire qu'aucune tentative n'est faite pour entreposer des lignes nouvelles ou mises à jour en fonction de leur ordre d'index. (Si l'on le souhaite, on peut
périodiquement redéfinir les unités d'allocation en exécutant à nouveau la commande. De plus, définir le paramètre d'entreposage fillfactor de la table à moins de 100 % peut aider à préserver
l'ordre des unités d'allocation pendant les mises à jour, car les lignes mises à jour sont conservées sur la même page si suffisamment d'espace est disponible là-bas.)
- Lorsqu'une table est mise en unité d'allocation, PostgreSQL se souvient par quel index elle a été mise en unité d'allocation. La format CLUSTER table_name reclus la table en utilisant
le même index qu'auparavant. Vous pouvez également utiliser les formats CLUSTER ou SET WITHOUT CLUSTER de ALTER TABLE pour définir l'index à utiliser
pour les futures opérations d'unité d'allocation ou pour effacer tout paramètre précédent.
- L'instruction CLUSTER sans aucun paramètre regroupe toutes les tables précédemment mises en unité d'allocation dans la base de données actuelle que possède l'utilisateur appelant, ou toutes
ces tables si elles sont appelées par un superutilisateur. Ce format de CLUSTER ne peut pas être exécutée à l'intérieur d'un bloc de transaction.
- Lorsqu'une table est mise en unité d'allocation, un verrou ACCESS EXCLUSIVE est posé dessus. Cela empêche toute autre opération de base de données (lecture et écriture) de fonctionner sur la
table jusqu'à ce que le CLUSTER soit terminé.
- Dans les cas où vous accédez de manière aléatoire à des lignes uniques dans une table, l'ordre réel des données dans la table n'a pas d'importance. Cependant, si vous avez tendance à accéder plus
souvent à certaines données qu'à d'autres, et qu'il existe un index qui les regroupe, vous bénéficierez de l'utilisation de CLUSTER. Si vous demandez une intervalle de valeurs indexées à partir
d'une table, ou une seule valeur indexée ayant plusieurs lignes correspondant, CLUSTER vous aidera car une fois que l'index identifie la page de table pour la première ligne correspondant, toutes
les autres lignes correspondant sont probablement déjà sur la même page de table, vous économisez ainsi les accès disque et accélérez la requête.
- L'instruction CLUSTER peut re-trier la table en utilisant soit un parcours d'index sur l'index spécifié, soit (si l'index est un B-tree) un parcours séquentiel suivi d'un tri.
Il tentera de choisir la méthode la plus rapide, en fonction des paramètres de coût du planificateur et des informations statistiques disponibles.
- Lorsqu'un parcours d'index est utilisé, une copie temporaire de la table est créée contenant 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. Par conséquent, vous avez besoin d'un espace libre sur le disque au moins égal à la somme de la taille de la table et des tailles d'index.
- Lorsqu'une analyse et un tri séquentiels sont utilisés, un fichier de tri temporaire est également créé, de sorte que l'exigence maximale d'espace temporaire correspond au double de la taille de la
table, plus les tailles d'index. Cette méthode est souvent plus rapide que la méthode d'analyse d'index, mais si l'espace disque requis est intolérable, vous pouvez désactiver ce choix en désactivant
temporairement enable_sort.
- Il est conseillé de définir maintenance_work_mem sur une valeur raisonnablement élevée (mais pas plus que la quantité de RAM que vous pouvez consacrer à l'opération CLUSTER) avant
l'unité d'allocation.
- Étant donné que le planificateur enregistre des statistiques sur l'ordre des tables, il est conseillé d'exécuter ANALYZE sur la table nouvellement groupée. Sinon,
le planificateur pourrait faire de mauvais choix de plans de requête.
- Étant donné que CLUSTER se souvient des index étant regroupés, on peut regrouper les tables que l'on veut mettre en unité d'allocation manuellement la première fois, puis configurer un
script de maintenance périodique exécutant CLUSTER sans aucun paramètre, de sorte que les tables souhaitées soient périodiquement regroupées.
Dernière mise à jour : Jeudi, le 14 Octobre 2021