2011-05-26 9 views
29

Tengo un índice en una tabla que me gustaría deshabilitar temporalmente, pero no puedo encontrar ninguna documentación que sugiera que es posible.¿Es posible deshabilitar temporalmente un índice en Postgres?

Motivo: Tengo un índice que puede estar causando problemas en consultas no relacionadas con ninguno de los que se diseñó para acelerar. Es un índice nuevo, y el sistema en su conjunto parece más lento desde que se introdujo. Solo quiero poder eliminarlo de manera confiable como el culpable, y esto parece ser la manera más fácil, otras sugerencias de soluciones, así como mejores sugerencias de preguntas, también son bienvenidas.

Respuesta

40

Puede meter el catálogo del sistema para desactivar un índice:

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

Esto significa que el índice no se utilizará para las consultas, pero todavía se actualiza. Es uno de los indicadores utilizados para la creación simultánea de índices. Tenga en cuenta que solo hice una prueba rápida para ver si el índice todavía parece estar actualizado, caveat emptor.

+1

¿Es posible desactivar las actualizaciones del índice también? – schmichael

+5

@schmichael Creo que si configura 'indisready' como falso, eso deshabilitará las actualizaciones: http://www.postgresql.org/docs/current/static/catalog-pg-index.html – araqnid

+1

también debería considerar las restricciones relacionadas a eso: 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; 

No creo que hay una manera de desactivar sólo uno, aunque se puede hacer esto en una transacción para hacer que se recupera de muertos sencilla. También puede desactivar indexscan para deshabilitar todos los índices.

Además, asegúrese de estar haciendo explain analyze en sus consultas.

+0

Gracias. Lamentablemente, mi problema es que no sé qué consultas se están ralentizando: todo para lo que instalé el índice es súper ágil, es solo que el sistema está quebrado. Por lo tanto, debo inhabilitar el índice globalmente durante unos minutos, no solo dentro de una transacción. – quodlibetor

+0

Darle un voto positivo porque esa es la forma correcta de hacerlo para una sola consulta. Si no fuera por la estúpida generalidad de mi problema, lo habrías arreglado. – quodlibetor

+0

El consejo de usar un 'EXPLAIN ANALYZE' es perfecto para comenzar a descubrir qué está pasando. Entonces puede decir: "¿por qué la presencia de un 'ÍNDICE' ocasiona que un' index_scan' pase de X a Y? " – Sean

Cuestiones relacionadas