Preciso recriar um índice no PostgreSQL que sofreu um inchaço de í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, em seguida, descartar o antigo. Existe alguma maneira de ver a instrução SQL que foi usada para criar um índice para que eu possa copiá-la?
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.
Sim, a instrução SQL completa para recriar o índice está no catálogo do sistema. A maneira mais simples que consigo pensar é usando pg_dump/pg_restore:
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');
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 postgres indexdef 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.
Mais simplesmente se você quiser todos (todos os índices)...