2011-05-26 12 views
29

J'ai un index sur une table que je voudrais désactiver temporairement, je ne trouve pas de documentation suggérant que c'est possible, cependant.Est-il possible de désactiver temporairement un index dans Postgres?

Raison: J'ai un index qui peut causer des problèmes dans des requêtes sans rapport avec celles pour lesquelles il a été conçu pour accélérer. C'est un nouvel indice, et le système dans son ensemble semble plus lent depuis son introduction. Je veux juste être en mesure de l'éliminer de manière fiable comme le coupable, et cela semble être le moyen le plus facile, d'autres suggestions de solutions, ainsi que de meilleures suggestions de questions, sont également les bienvenus.

Répondre

40

Vous pouvez pousser le catalogue système pour désactiver un index:

update pg_index set indisvalid = false where indexrelid = 'test_pkey'::regclass 

Cela signifie que l'indice ne sera pas utilisé pour les requêtes, mais sera toujours mis à jour. C'est l'un des drapeaux utilisés pour la construction d'index simultanée. Notez que j'ai seulement fait un test rapide pour voir si l'index semble toujours être mis à jour, caveat emptor.

+1

Est-il possible de désactiver également les mises à jour de l'index? – schmichael

+5

@schmichael Je pense que si vous définissez 'indisready' à false, cela désactivera les mises à jour: http://www.postgresql.org/docs/current/static/catalog-pg-index.html – araqnid

+1

, vous devriez également considérer les restrictions liées à cela: http://serverfault.com/questions/300123/how-to-edit-system-catalogs-in-postgresql-8-1/ –

21
begin; 
drop index foo_ndx; 
explain analyze select * from foo; 
rollback; 

Je ne pense pas qu'il y ait un moyen de désactiver un seul, mais vous pouvez le faire dans une transaction pour faire la récupération de ce mort simple. Vous pouvez également désactiver indexscan pour désactiver tous les index.

En outre, assurez-vous que vous faites explain analyze sur vos requêtes.

+0

Merci. Malheureusement, mon problème est que je ne sais pas quelles requêtes sont ralenties: tout ce pour quoi j'ai installé l'index est super-accrocheur, c'est tout le système qui est cassé. J'ai donc besoin de désactiver l'index globalement pendant quelques minutes, pas seulement dans une transaction. – quodlibetor

+0

Vous donner un upvote parce que c'est la bonne façon de le faire pour une seule requête. Si ce n'était pas pour la généralité stupide de mon problème, tu l'aurais réparé. – quodlibetor

+0

Le conseil d'utiliser un 'EXPLAIN ANALYZE' est sur place pour commencer à comprendre ce qui se passe. Alors vous pouvez dire, "pourquoi est la présence d'un' INDEX' qui cause le temps pour un 'index_scan' d'aller de X à Y?" – Sean

Questions connexes