Si je crée un indice simultanément dans PostgreSQL, comment puis-je voir quand il est fini?
Je tente de reconstruire des index pour résoudre l'index de blot, et je dois garder l'ancien index pendant un moment jusqu'à ce que le nouveau soit terminé, alors j'ai besoin de savoir quand c'est fini.
C'est PostgreSQL 9.2/3SH
Vous pouvez obtenir une liste d'index non valides.
SELECT * FROM pg_class, pg_index WHERE pg_index.indisvalid = false AND pg_index.indexrelid = pg_class.oid;
Si vous voyez votre index dans cette requête, cela signifie que l'index ne fonctionnera pas et vous devez recréer l'index.
Ne faites pas REINDEX
. Il ne recréera pas l'index simultanément, il verra la table des écrivies pendant la création de l'index, la meilleure solution consiste à supprimer l'index non valide et à le recréer avec CONCURRENTLY
drapeau
Combinant le commentaire de @Rory et d'informations dans la réponse de @zaytsev Dmitry:
Le CREATE INDEX CONCURRENTLY
ne reviendra pas avant que l'index ait fini de construire. Donc, vous savez que l'index est effectué lorsque votre requête revient.
Toutefois, si vous construisez un grand indice, vous pouvez vous demander s'il est "vraiment" en cours d'exécution.
Vous pouvez utiliser la requête des index 'invalides':
SELECT * FROM pg_class, pg_index WHERE pg_index.indisvalid = false AND pg_index.indexrelid = pg_class.oid;
... Si votre index apparaît dans les résultats, il a échoué ou est toujours en cours.
Une autre façon de confirmer ce dernier est de vérifier la table des serrures:
SELECT a.datname,
l.relation::regclass,
l.transactionid,
l.mode,
l.GRANTED,
a.usename,
a.query,
a.query_start,
age(now(), a.query_start) AS "age",
a.pid
FROM pg_stat_activity a
JOIN pg_locks l ON l.pid = a.pid
WHERE mode = 'ShareUpdateExclusiveLock'
ORDER BY a.query_start;
Bien que simultanément ne prenne pas de verrouillage exclusif sur la table, il contiendra une plus faible ShareUpdateExclusiveLock
que vous devriez voir dans les résultats de cette requête.
S'il n'y a pas de verrou, cela implique que l'index a terminé le bâtiment ou la création a échoué et laissé un index non valide.
Entre ces deux requêtes, vous pouvez ainsi déterminer lequel des trois états possibles (complété/en cours/en cours/échec) Votre index est dans.