Por padrão, o IMCI sincroniza atualizações e exclusões de dados usando a chave primária. Quando uma tabela não tem chave primária ou usa uma chave não ordenada (como UUID), a sincronização gera E/S aleatória excessiva e degrada o desempenho. Defina uma chave de replicação personalizada em uma coluna ordenada para converter E/S aleatória em E/S sequencial.
Pré-requisitos
A tabela deve ter uma coluna com valores monotonicamente crescentes no armazenamento físico.
Considerações
Observe as seguintes restrições:
A chave de replicação deve referenciar um índice único, especificado com a cláusula
USING INDEX.Todas as colunas do índice único devem ser definidas como
NOT NULL.Para obter melhor desempenho, crie o índice único em uma coluna monotonicamente crescente, como
SERIALouBIGSERIAL.
Como funciona
Mecanismo REPLICA IDENTITY
A propriedade REPLICA IDENTITY controla quais valores de coluna são gravados no WAL (write-ahead log) para identificar linhas alteradas durante a replicação lógica. O IMCI usa esse mecanismo para localizar e atualizar linhas no columnar store. O REPLICA IDENTITY oferece quatro modos:
|
Modo |
Descrição |
Caso de uso |
|
|
Usa a chave primária como identidade de replicação. |
Modo padrão e recomendado. Nenhuma alteração é necessária se a tabela tiver chave primária. |
|
|
Usa um índice único especificado como identidade de replicação. |
Especifique um índice único ordenado para melhorar a eficiência quando a tabela não tiver chave primária ou tiver uma chave primária não ordenada. |
|
|
Grava os valores de todas as colunas da linha no WAL. |
Use apenas quando a tabela não tiver chave primária nem índice único, mas precisar oferecer suporte a operações UPDATE ou DELETE. |
|
|
Não registra informações de identificação. |
Use apenas para tabelas somente de inserção que não suportam atualizações ou exclusões. |
Índice único ordenado como chave de replicação
O princípio central consiste em usar o modo USING INDEX para definir a chave de replicação como um índice único em uma coluna ordenada, como uma coluna de incremento automático.
Fluxo de trabalho:
Crie um índice único em uma coluna fisicamente ordenada, como uma coluna de incremento automático
SERIAL.Execute
ALTER TABLE ... REPLICA IDENTITY USING INDEX ...para alterar a identidade de replicação da tabela para o novo índice.Durante a replicação lógica, o sistema decodifica os valores de chave ordenados do WAL.
O IMCI usa esses valores de chave ordenados para localizar e atualizar dados no columnar store por meio de E/S sequencial, em vez de E/S aleatória, aumentando significativamente o desempenho da sincronização.
Procedimento
-
Etapa 1: Crie um índice único
Crie um índice único na coluna ordenada de incremento automático.
-- Assuming table t has an auto-incrementing column named serial_id CREATE UNIQUE INDEX idx_t_serial_id ON t(serial_id); -
Etapa 2: Alterar a identidade de replicação
Altere o
REPLICA IDENTITYda tabela para o índice único criado na etapa anterior.ALTER TABLE t REPLICA IDENTITY USING INDEX idx_t_serial_id; -
Etapa 3: Crie ou recrie o índice do columnar store
Verifique se o índice do columnar store (CSI) inclui a coluna da chave de replicação. Se já existir um CSI, recrie-o para garantir o desempenho ideal.
-- Create a columnar store index that includes all columns CREATE INDEX ON t USING csi; -
Etapa 4: Comparar o desempenho
O experimento a seguir demonstra a melhoria de desempenho obtida.
-
Configuração do teste:
-
Crie uma tabela com uma chave primária não ordenada (
random_id) e uma coluna ordenada de incremento automático (serial_id).create table t (random_id text primary key, serial_id serial, a text); -
Insira 10 milhões de linhas de dados.
insert into t(random_id, a) select md5(i::text), i::text from generate_series(1, 10000000) i; -
Crie um índice do columnar store e um índice único ordenado,
idx_a, na colunaserial_id.create unique index idx_a on t(serial_id); create index on t using csi;
-
-
Procedimento de teste:
-
Teste no modo padrão (usando a chave primária não ordenada
random_idcomo chave de replicação):-- Update 10,000 rows UPDATE t SET a = '0' WHERE serial_id <= 10000; -
Teste no modo personalizado (alterando a chave de replicação para o índice único ordenado
idx_a):ALTER TABLE t REPLICA IDENTITY USING INDEX idx_a; -- Update another 10,000 rows UPDATE t SET a = '1' WHERE serial_id <= 10000;
-
-
Resultados do teste:
Tipo de chave de replicação
Padrão (chave primária não ordenada)
Personalizado (índice único ordenado)
Tempo de sincronização (10.000 linhas)
~0,5 segundos
~0,01 segundos
-
Conclusão
A melhoria de aproximadamente 50 vezes demonstra que uma chave de replicação personalizada ordenada é fundamental para sincronizar dados eficientemente no IMCI.