Existe uma maneira de mostrar a instrução de criação de um índice no PostgreSQL

14

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?

Rory
fonte
2
stackoverflow.com/questions/25958693
a_horse_with_no_name
11
Lembre-se de adicionar CONCURRENTLYao CREATE INDEXcomando, para não ter um bloqueio exclusivo na mesa.
Craig Ringer

Respostas:

26

Na verdade, basta consultar a pg_indexesexibição do catálogo do sistema da seguinte maneira:

SELECT indexdef FROM pg_indexes WHERE indexname = '...'

e você deve recuperar a instrução SQL usada para defini-la.

TomH
fonte
4
Observe que os nomes de índice são exclusivos apenas por esquema . Você pode querer adicionar AND schemaname = 'myschema'.
Erwin Brandstetter
0

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:

$ pg_dump -F c | pg_restore -I <your_index_name>
Egor Rogov
fonte
4
Se o banco de dados for grande, isso pode ser um exagero :) Você pode adicionar -spara excluir dados e, se conhecido, o nome da tabela com -t.
Dez15
-1

Mais simplesmente, se você quiser todos (todos os índices) ...

=# SELECT indexdef FROM pg_indexes;
Michelle Sullivan
fonte
-1

indexdefainda 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.

Tom Lei
fonte
Isso não responde à pergunta.
Laurenz Albe