Alterei a estrutura da tabela e estou prestes a remover a coluna JSONB antiga de uma tabela grande com cerca de 2,5 milhões de linhas. O JSONB torna esta tabela realmente grande - pg_total_relation_size: 408GB
O desempenho ALTER TABLE ... DROP COLUMN ..;
foi tão pesado que bloqueou todo o banco de dados e causou 502 na maioria dos serviços.
PERGUNTA: se eu definir a coluna JSONB como NULL antes de executar ALTER TABLE DROP COLUMN, ela será mais rápida? Ou existe alguma outra opção, excluindo aquela que lida com todas as colunas, exceto aquela que visa colocar em uma tabela separada e trocar os nomes depois?
ALTER TABLE ... DROP COLUMN
é sempre muito rápido, porque é uma operação de metadados. Se demorar muito para você, é porque há transações simultâneas de longa execução usando a tabela:ALTER TABLE
instruções que modificam a estrutura da tabela exigem umACCESS EXCLUSIVE
bloqueio que entra em conflito com todo o resto.Você terá que esperar até que ninguém use a tabela para executar sua instrução.
O maior problema é que isso não
ALTER TABLE ... DROP COLUMN
reduzirá o tamanho da tabela - apenas fará com que o PostgreSQL "ignore" os dados da coluna nas linhas existentes.Para realmente se livrar da coluna, você teria que realizar uma modificação de dados sem efeito, como
que reescreverá toda a tabela. No entanto, isso aumentará consideravelmente o tamanho da tabela devido à arquitetura multiversão do PostgreSQL.
Então você acabaria fazendo isso em lotes como
e execute
VACUUM
na mesa após cada lote.Uma maneira alternativa e mais simples de reduzir a tabela após eliminar a coluna é
pg_dump
restauráDROP
-la.