Eu executei uma consulta de migração dentro de uma transação , ficou assim:
alter table big_and_loaded_table
add column col1 bool;
update big_and_loaded_table set col1 = false;
Parece bastante inocente, mas levou cerca de dois minutos para ser executado. Além disso, ele "bloqueou" big_and_loaded_table
: qualquer consulta no meu aplicativo que o envolvesse - leitura e gravação - demorava tanto para ser executada, o mesmo minuto ou mais. Eu não uso transações em minha aplicação, assim como qualquer tipo de bloqueio explícito.
Então eu tenho duas perguntas:
- Por que essa consulta de migração demorou tanto para ser executada? Foi por causa de uma transação? Ou foi por causa da própria consulta?
- Por que bloqueou as consultas de aplicativos que envolviam a tabela
big_and_loaded_table
? - Como devo executar esses tipos de migrações no futuro? Provavelmente este ponto não fará nenhum sentido quando eu descobrir os dois primeiros.
A versão do Postgres é 11.6.
O Postgres 11 adicionou um recurso em que uma reescrita de tabela não é necessária se você adicionar uma coluna com um valor padrão.
se você tivesse usado
a instrução teria executado quase instantaneamente com o mesmo efeito.
Mas uma instrução ALTER TABLE adquirirá um bloqueio exclusivo para impedir o acesso à tabela enquanto ela estiver sendo alterada, não há como contornar isso.