O que acontece quando adicionamos um índice a uma tabela existente com uma grande quantidade de dados?

11

Eu tenho uma tabela que conterá cerca de 15 milhões de registros. Agora eu preciso adicionar um índice à tabela.

A adição de um índice levará algum tempo para atualizar todas as entradas da tabela.

Estou bastante confuso se adicionar o índice causará tempo de inatividade.

Se sim, como posso superar o tempo de inatividade?

Harry Suren
fonte
2
Veja Criando índices
simultaneamente

Respostas:

10

Com simples CREATE INDEX, a tabela será bloqueada para gravações, mas não para leituras.

Use CREATE INDEX CONCURRENTLYpara evitar bloqueios de gravação também.

Nos documentosCREATE INDEX do PostgreSQL sobre :

Quando essa opção é usada, o PostgreSQL cria o índice sem usar nenhum bloqueio que impeça inserções, atualizações ou exclusões simultâneas na tabela; enquanto uma compilação de índice padrão bloqueia gravações (mas não leituras) na tabela até que seja concluída. Há várias advertências a serem observadas ao usar esta opção - consulte Construindo índices simultaneamente .

E, mais especificamente (como o @ypercube comentou ):

O PostgreSQL suporta a construção de índices sem bloquear as gravações . Este método é chamado especificando a CONCURRENTLYopção de CREATE INDEX. Quando essa opção é usada, o PostgreSQL deve executar duas varreduras da tabela e, além disso, deve aguardar o término de todas as transações existentes que possam potencialmente usar o índice. Portanto, esse método requer mais trabalho total do que uma compilação de índice padrão e leva muito mais tempo para ser concluído. No entanto, como permite que operações normais continuem enquanto o índice é criado, esse método é útil para adicionar novos índices em um ambiente de produção.

Negrito ênfase minha.

Fabrizio Mazzoni
fonte