it-swarm-fr.com

Reindex est-il dangereux?

J'ai essayé de COUNT(*) une table avec 150 000 lignes ayant une clé primaire. Il outil est d'environ 5 minutes, j'ai donc compris qu'il s'agit d'un problème d'indexation.

Citant le Manuel PostgreSQL :

Reindex est similaire à une chute et recrée de l'indice en ce que le contenu de l'indice est reconstruit à partir de zéro. Cependant, les considérations de verrouillage sont plutôt différentes. Reindex verrouille écrit mais ne se lit pas sur la table des parents de l'index. Il prend également une serrure exclusive sur l'indice spécifique étant traitée, qui va bloquer la lecture de cette tentative d'utilisation de cet index (...) L'index de création ultérieure verrouille des écritures, mais pas la lit; Étant donné que l'index n'est pas là, aucune lecture ne tentera de l'utiliser, ce qui signifie qu'il n'y aura pas de blocage mais que les lectures ne seront pas forcées dans des analyses séquentielles coûteuses.

De votre propre expérience, pouvez-vous dire:

  • est REINDEXING dangereux? Peut-il nuire à la cohérence des données?
  • Peut-il prendre beaucoup de temps?
  • Est-ce une solution probable à mon scénario?

Mise à jour:

La solution qui a fonctionné pour nous a recréé le même index avec un nom différent, puis supprimant l'ancien index.

La création d'index est très rapide et nous avons réduit la taille de l'index de 650 Mo à 8 Mo. L'utilisation d'une fonction COUNT(*) avec between ne prend que 3 secondes.

17
Adam Matan

Je ne suis pas sûr de la meilleure réponse pour vous. Cependant, ce fil semble offrir de bonnes suggestions: N http://postgresql.1045698.n5.nfabababil.com/count-performance-issue-td2067873.html

Une note est que vous pouvez implémenter une gâchette pour maintenir les comptes de ligne dans une table séparée (si le nombre (*) serait appelé fréquemment par vos applications).

Quelques réponses suggèrent que cela est symptomatique d'une base de données qui n'a pas été aspiré assez récemment (suggérant que Autovacuum est désactivé sur votre serveur ou pour cette base de données en particulier)?

Une autre suggestion ressemble à:

ANALYZE tablename;
SELECT reltuple FROM pg_class WHERE relname = 'tablename';

Et une personne identifiée comme A. Kretschmer Notes:

non. L'indice actuel ne contient aucune information sur la visibilité de la ligne dans la transaction en cours. Vous devez numériser l'ensemble de la table de données pour obtenir si la ligne actuelle est visible dans la transaction en cours.

... Soutenir mon commentaire sur les autorisations de niveau de ligne Être un problème de performance.

Ma recherche est également retournée Wikivs: MySQL vs. PostgreSQL: Count (*) .

Vous pouvez parcourir les autres résultats que j'ai trouvés à l'aide de Google: Performances de comptage PostgreSQL (*)

1
Jim Dennis