

REINDEX — reconstruit les index
REINDEX [ ( VERBOSE ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } nom
   REINDEX reconstruit un index en utilisant les données
   stockées dans la table, remplaçant l'ancienne copie de l'index. Il y a
   plusieurs raisons pour utiliser REINDEX :
   
      Un index a été corrompu et ne contient plus de données valides. Bien
      qu'en théorie, ceci ne devrait jamais arriver, en pratique, les index
      peuvent se corrompre à cause de bogues dans le logiciel ou d'échecs
      matériels. REINDEX fournit une méthode de récupération.
     
      L'index en question a « explosé », c'est-à-dire qu'il contient
      beaucoup de pages d'index mortes ou presque mortes. Ceci peut arriver
      avec des index B-tree dans PostgreSQL sous
      certains modèles d'accès inhabituels.
      REINDEX fournit un moyen de réduire la consommation
      d'espace de l'index en écrivant une nouvelle version de l'index sans les
      pages mortes. Voir Section 24.2 pour plus
      d'informations.
     
Vous avez modifié un paramètre de stockage (par exemple, fillfactor) pour un index et vous souhaitez vous assurer que la modification a été prise en compte.
      La construction d'un index avec l'option CONCURRENTLY a
      échoué, laissant un index « invalide ». De tels index sont
      inutiles donc il est intéressant d'utiliser REINDEX
      pour les reconstruire. Notez que REINDEX n'exécutera pas
      une construction en parallèle. Pour construire l'index sans interférer avec
      le système en production, vous devez supprimer l'index et ré-exécuter la
      commande CREATE INDEX CONCURRENTLY.
     
INDEXRecrée l'index spécifié.
TABLERecrée tous les index de la table spécifiée. Si la table a une seconde table « TOAST », elle est aussi réindexée.
SCHEMA
      Recrée tous les index du schéma spécifié. Si une table de ce schéma a
      une table secondaire (« TOAST »), elle est aussi réindexée.
      Les index sur les catalogues systèmes partagées sont aussi traités.
      Cette forme de REINDEX ne peut pas être exécutée dans
      un bloc de transaction.
     
DATABASE
      Recrée tous les index de la base de données en cours. Les index sur
      les catalogues système partagés sont aussi traités. Cette forme de
      REINDEX
      ne peut pas être exécutée à l'intérieur d'un bloc de transaction.
     
SYSTEM
      Recrée tous les index des catalogues système à l'intérieur de la base de
      données en cours. Les index sur les catalogues système partagés sont aussi
      inclus. Les index des tables utilisateur ne sont pas traités. Cette forme
      de REINDEX ne peut pas être exécutée à l'intérieur d'un
      bloc de transaction.
     
nom
      Le nom de l'index, de la table ou de la base de données spécifique à
      réindexer. Les noms de table et d'index peuvent être qualifiés du nom du
      schéma. Actuellement, REINDEX DATABASE et
      REINDEX SYSTEM ne peuvent réindexer que la base de
      données en cours, donc ce paramètre doit correspondre au nom de la
      base de données en cours.
     
VERBOSEAffiche un message de progression à chaque index traité.
   Si vous suspectez la corruption d'un index sur une table utilisateur, vous
   pouvez simplement reconstruire cet index, ou tous les index de la table, en
   utilisant REINDEX INDEX ou REINDEX
    TABLE.
  
   Les choses sont plus difficiles si vous avez besoin de récupérer la
   corruption d'un index sur une table système. Dans ce cas, il est important
   pour le système de ne pas avoir utilisé lui-même un des index suspects. (En
   fait, dans ce type de scénario, vous pourriez constater que les processus
   serveur s'arrêtent brutalement au lancement du service, en cause l'utilisation
   des index corrompus.) Pour récupérer proprement, le serveur doit être lancé
   avec l'option -P, qui inhibe l'utilisation des index pour
   les recherches dans les catalogues système.
  
   Une autre façon est d'arrêter le serveur et de relancer le serveur
   PostgreSQL en mode simple utilisateur avec l'option
   -P placée sur la ligne de commande. Ensuite,
   REINDEX DATABASE, REINDEX SYSTEM,
   REINDEX TABLE ou REINDEX INDEX peuvent être lancés
   suivant ce que vous souhaitez reconstruire. En
   cas de doute, utilisez la commande REINDEX SYSTEM pour activer la
   reconstruction de tous les index système de la base de données. Enfin,
   quittez la session simple utilisateur du serveur et relancez le serveur en mode normal. Voir
   la page de référence de postgres pour plus
   d'informations sur l'interaction avec l'interface du serveur en mode simple utilisateur.
  
   Une session standard du serveur peut aussi être lancée avec
   -P dans les options de la ligne de commande. La
   méthode pour ce faire varie entre les clients mais dans tous les clients
   basés sur libpq, il est possible de configurer la variable
   d'environnement PGOPTIONS à -P avant de lancer le
   client. Notez que, bien que cette méthode ne verrouille
   pas les autres clients, il est conseillé d'empêcher les autres
   utilisateurs de se connecter à la base de données endommagée jusqu'à la fin
   des réparations.
  
   REINDEX est similaire à une suppression et à une nouvelle
   création de l'index. Dans les faits, le contenu de l'index est complètement
   recréé. Néanmoins, les considérations de verrouillage sont assez
   différentes. REINDEX verrouille les écritures mais pas les
   lectures de la table mère de l'index. Il positionne également un verrou de
   type ACCESS EXCLUSIVE sur l'index en cours de
   traitement, ce qui bloque les lectures qui tentent de l'utiliser. Au
   contraire, DROP INDEX prends temporairement un verrou de
   type ACCESS EXCLUSIVE sur la table parent, bloquant
   ainsi écritures et lectures.
   Le CREATE INDEX qui suit verrouille les écritures mais pas les
   lectures ; comme l'index n'existe pas, aucune lecture ne peut être
   tentée, signifiant qu'il n'y a aucun blocage et que les lectures sont
   probablement forcées de réaliser des parcours séquentiels complets.
  
Ré-indexer un seul index ou une seule table requiert d'être le propriétaire de cet index ou de cette table. Ré-indexer une base de données requiert d'être le propriétaire de la base de données (notez du coup que le propriétaire peut reconstruire les index de tables possédées par d'autres utilisateurs). Bien sûr, les superutilisateurs peuvent toujours tout ré-indexer.
Reconstruit un index simple :
REINDEX INDEX my_index;
  Recrée les index sur la table ma_table :
  
REINDEX TABLE ma_table;
Reconstruit tous les index d'une base de données particulière sans faire confiance à la validité des index système :
$export PGOPTIONS="-P"$psql broken_db... broken_db=> REINDEX DATABASE broken_db; broken_db=> \q
  Il n'existe pas de commande REINDEX dans le standard SQL.