Eu tenho um grande banco de dados PostgreSQL 9.3. Um índice em uma tabela é muito grande e parece estar inchado. Estou usando o pgcompact do pgtoolkit para reduzir o inchaço do banco de dados sem bloqueios de tabela pesados. No entanto, não reindexaria esse índice grande, pois é um índice GIN. Ele sugeriu esse trecho de código SQL como uma forma de reindexar esse índice. ( mytable
é a tabela, myindex
é o índice. myindex
é apenas um índice GIN na nodes
coluna (bigint) de mytable
).
CREATE INDEX CONCURRENTLY pgcompact_index_17791 ON mytable USING gin (nodes) WITH (fastupdate=off);
BEGIN;
SET LOCAL statement_timeout TO 1000;
ALTER INDEX public.myindex RENAME TO pgcompact_temp_index_17791;
ALTER INDEX public.pgcompact_index_17791 RENAME TO myindex;
END;
DROP INDEX CONCURRENTLY public.pgcompact_temp_index_17791;
Esse snippet realmente reindexará o myindex
índice e reduzirá o inchaço do índice da tabela ?
Qual é o sentido de renomear o índice antigo ( myindex
) para o nome do índice temporário ( pgcompact_temp_index_17791
) e, em seguida, renomeá-lo novamente? Isso não resultará na substituição do índice temporário que está sendo criado e, em seguida, apenas renomeá-lo de volta, o que significa que myindex
não é reconstruído? O autor do pgtoolkit parece bastante experiente, mas não entendo como isso funciona e não quero executar o SQL no meu banco de dados sem entendê-lo.
Se essa abordagem funcionar, qual é a diferença entre isso e fazer REINDEX INDEX myindex;
?