Preciso recriar um índice no PostgreSQL que sofreu inchaço no índice. Como preciso que o índice seja utilizável enquanto está sendo criado, não posso usar o REINDEX. Vou recriar o índice com um novo nome e depois largar o antigo. Existe alguma maneira de ver a instrução SQL que foi usada para criar um índice para que eu possa copiar isso?
postgresql
index
Rory
fonte
fonte
CONCURRENTLY
aoCREATE INDEX
comando, para não ter um bloqueio exclusivo na mesa.Respostas:
Na verdade, basta consultar a
pg_indexes
exibição do catálogo do sistema da seguinte maneira:e você deve recuperar a instrução SQL usada para defini-la.
fonte
AND schemaname = 'myschema'
.Sim, a instrução SQL completa para recriar o índice está no catálogo do sistema. A maneira mais simples de pensar é usando pg_dump / pg_restore:
fonte
-s
para excluir dados e, se conhecido, o nome da tabela com-t
.Mais simplesmente, se você quiser todos (todos os índices) ...
fonte
indexdef
ainda não é exatamente o mesmo que a instrução de criação no caso de um índice parcial. Por exemplo, se criarmos um índice com a seguinte instrução:CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');
O postgres irá gerar o seguinte indexdef:
CREATE INDEX item_orgunit_idx ON public.items USING btree (orgunit_id) WHERE ((type)::text = ANY ((ARRAY['invoice'::character varying, 'purchaseorder'::character varying, 'beanpayment'::character varying])::text[]))
Embora o indexdef do postgres tenha todos os tipos inferidos e provavelmente seja melhor, nosso ORM está comparando a cláusula where dos dois índices e pensa que é diferente quando geramos scripts de migração. O que é um problema para nós.
fonte