Postgres depende de bloqueios diferentes para garantir que todas as transações possam ser executadas conforme o esperado. A transação que primeiro obtém uma trava deve ser concluída. A menos que seja feita uma reversão ou compromisso, outra transação não pode avançar devido à fechadura. Nosso foco hoje é entender como criar índices simultaneamente para evitar travar.
Como funciona o bloqueio
Antes de mergulhar na criação de índices simultaneamente, vale a pena entender como o Postgres implementa bloqueios e vendo como eles afetam a transação, a menos que você saiba como lidar com eles.
Para este caso, criamos uma tabela e iniciamos uma transação para alterar a tabela para adicionar uma nova coluna. A partir da imagem a seguir, podemos ver que, uma vez que a transação altera se segure à trava como a primeira transação, o comando select falha ao responder no segundo shell PSQL.
Este caso ocorre porque a primeira transação emite um bloqueio. Você encontrará um caso semelhante quando não indexar simultaneamente, como veremos na seção posterior.
No entanto, quando você emite um comando de reversão para a primeira transação, podemos notar imediatamente que o bloqueio é liberado. Agora, a segunda transação pode prosseguir.
É assim que as fechaduras funcionam nas mesas. Blocks leia e grava transações quando um comando ddl é executado. Com esse entendimento, podemos seguir para criar índices simultaneamente.
Como usar o PostGresql para criar um índice simultaneamente
Ao criar índices no PostgreSQL, a operação pode bloquear rapidamente todas as outras transações e pode levar a perdas. Ao indexar uma tabela, o Postgres o trava nas operações de gravação, como operações de atualização e alteração, até que a construção do índice seja concluída.
A transação do índice pode levar horas ou longos minutos, dependendo do tamanho do seu banco de dados. Licar outras transações em um ambiente de produção significa que o sistema pode ser renderizado inutilizável até que a construção do índice seja concluída. Se você tem esse cenário, a melhor solução é criar índices simultaneamente, o que acabará com bloqueios.
A indexação garante simultaneamente que uma transação não bloqueie outras transações. Assim, transações normais podem ocorrer no meio de um processo de construção. Quando você adiciona simultaneamente na indexação, PostgreSQL digitaliza a tabela indexada e aguarda que todas as transações terminem. Assim, a indexação demora simultaneamente, mas garante que nenhum atraso seja encontrado em um ambiente de produção. Vamos ver um exemplo de indexação normal para entender como o bloqueio pode causar o caos em um ambiente de produção.
Aqui, temos uma tabela chamada "Detalhes" na qual acessamos em nosso shell Postgres. Suponha que queremos criar um índice "btree" em uma coluna. Podemos executar o seguinte comando:
Nosso índice é criado com sucesso porque estamos lidando com uma pequena mesa.
No entanto, o mesmo comando pode levar horas para executar se você estiver em um ambiente de produção ao vivo. Se você abrir outro shell do PSQL e tentar escrever para a mesma tabela, o shell não responderá até que a indexação seja concluída. Se alguém tentar atualizar, inserir ou executar outra operação de gravação, será trancado.
Esse cenário pode ser corrigido pela indexação da mesma tabela simultaneamente. A seguir, a sintaxe é criar um índice simultaneamente:
Criar índice simultaneamente o nome do nome no nome da tabela (coluna-name)
Se quisermos repetir o mesmo índice que fizemos anteriormente, mas, nesse caso, simultaneamente, nosso novo comando seria o seguinte:
Nesse caso, se a indexação levar mais tempo e abrirmos outro shell para realizar uma operação de gravação na tabela que estamos indexando, não conseguimos nenhum erro de bloqueio, pois a compilação do índice é feita simultaneamente.
Você também pode criar um "índice simultâneo exclusivo" adicionando a palavra -chave "exclusiva". A indexação exclusiva elimina a redundância e levanta erros sempre que detectar um valor redundante da coluna.
Aqui está um exemplo de indexação simultânea exclusiva:
Quando você vê a tabela de índice, você notará que a indexação ocorreu com sucesso e pode ver qual coluna possui a indexação exclusiva.
# \ d tabela-name;Conclusão
Criar um índice sem uma abordagem simultânea leva a transações de bloqueio e bloqueio. No entanto, quando você indexa simultaneamente, a construção do índice será concluída sem impedir que outras transações ocorram. Esta postagem ajuda você a entender como o bloqueio funciona ao trabalhar com tabelas nas postes. Além disso, explicamos como criar um índice simultaneamente para evitar o bloqueio ao trabalhar com PostgreSQL.