Use a instrução UPDATE para modificar valores de colunas em linhas que correspondam a uma condição especificada.
Sintaxe
UPDATE <table> [ * ] [ [ AS ] <alias> ]
SET { <column> = { <expression> } |
( <column> [, ...] ) = ( { <expression> } [, ...] ) } [, ...]
[ FROM <from_list> ]
[ WHERE <condition> ]
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nome da tabela a atualizar. |
|
|
Nome alternativo para a tabela. |
|
|
Nome da coluna a atualizar. |
|
|
Expressão que gera o novo valor da coluna. |
|
|
Coluna na tabela source, usada ao atualizar com dados de outra tabela. |
|
|
Condição que as linhas devem atender para atualização. Linhas fora da condição permanecem inalteradas. |
Para a especificação completa do UPDATE no PostgreSQL, consulte UPDATE.
Funcionamento
Cada tabela do Hologres tem três arquivos associados: um arquivo de dados, um arquivo de índice de chave primária e um arquivo de tag. Os arquivos de tag servem principalmente para cenários de exclusão ou atualização de dados via DELETE, UPDATE, INSERT ON CONFLICT ou outras instruções. Para mais informações sobre o arquivo de índice de chave primária, consulte PK.
Ao executar o UPDATE, o Hologres grava os novos dados na tabela de memória (Mem Table) e depois os libera assincronamente para o disco:
Tabelas orientadas a linhas: O sistema libera os novos dados para um novo arquivo e remove os dados antigos durante a compactação em segundo plano.
Tabelas orientadas a colunas: O Hologres cria uma tabela de tags na memória para registrar o ID do arquivo e o ID da linha dos dados a substituir. Os novos dados vão para um novo arquivo, enquanto a tabela de tags é liberada para um arquivo de tag. Durante a compactação, o sistema limpa os dados antigos e mescla os novos.
Como a compactação é assíncrona, o uso de armazenamento aumenta durante a execução do UPDATE e normaliza após a conclusão da compactação.
A eficiência de atualização em tabelas orientadas a linhas supera a das tabelas orientadas a colunas.
Tabelas com chave primária
Se a tabela tiver chave primária, o Hologres usa o arquivo de índice dessa chave para localizar o identificador de linha (RID) e acessar diretamente os arquivos de dados alvo. Isso permite ignorar arquivos não relacionados e atualizar apenas as linhas correspondentes.
Sem chave primária, o Hologres precisa varrer toda a tabela para encontrar as linhas correspondentes, o que impacta o desempenho. Para mais informações, consulte PK.
Atualizações parciais
Uma atualização parcial modifica apenas um subconjunto de colunas em uma linha e mantém as demais inalteradas. Esse recurso exclusivo do Hologres atende a diversos requisitos de negócios. Todos os três formatos de armazenamento suportam atualizações parciais, mas lidam com a leitura prévia à escrita de maneiras diferentes:
|
Formato de armazenamento |
Comportamento da atualização parcial |
|
Orientado a linhas |
Grava dados no modo Append Only usando a estrutura LSM (log-structured merge). Não requer leitura prévia à escrita. |
|
Orientado a colunas |
Requer leitura das colunas vazias antes de gravar os novos dados, o que aumenta o consumo de recursos. |
|
Híbrido (linha-coluna) |
Lê as colunas vazias da parte orientada a linhas, reduzindo o consumo de recursos em comparação às tabelas orientadas a colunas. |
Com fixed plans, o desempenho da atualização parcial segue esta ordem (do mais rápido para o mais lento):
row-oriented > row-column hybrid > column-oriented
Sem fixed plans, as atualizações parciais funcionam como uma junção entre duas tabelas. Nesse caso, a classificação de desempenho muda:
column-oriented > row-column hybrid > row-oriented
Para a maioria das cargas de trabalho de atualização em tempo real com fixed plans, as tabelas orientadas a linhas oferecem o melhor desempenho. Consulte Instrução UPDATE para obter orientações sobre como habilitar fixed plans.
Limitações
Chaves de distribuição não podem ser atualizadas. Para alterar o valor de uma chave de distribuição, exclua a linha e insira-a novamente com o novo valor.
Atualizar uma tabela particionada afeta as tabelas filhas, não a tabela pai. Execute o UPDATE diretamente na tabela filha específica que contém as linhas a modificar.
Use fixed plans para obter melhor desempenho. Sem eles, as atualizações parciais são tratadas como junções de tabelas, alterando tanto as características quanto a classificação de desempenho entre os formatos de armazenamento. Consulte Instrução UPDATE.
Exemplos
Os exemplos abaixo usam uma tabela de amostra:
CREATE TABLE update_test (
a text primary key,
b int not null,
c text not null,
d text
);
INSERT INTO update_test VALUES ('b1', 10, '', '');
Atualize uma coluna usando uma expressão aritmética
UPDATE update_test SET b = b + 10 WHERE a = 'b1';
Atualize várias colunas usando uma condição em outra coluna
UPDATE update_test SET c = 'new_' || a, d = null WHERE b = 20;
Atualize várias colunas sem uma condição WHERE (atualiza todas as linhas)
UPDATE update_test SET (b, c, d) = (1, 'test_c', 'test_d');
Atualize uma coluna usando dados de outra tabela
CREATE TABLE tmp (a int);
INSERT INTO tmp VALUES (2);
UPDATE update_test SET b = tmp.a FROM tmp;
Atualização parcial: modifique uma coluna e mantenha as outras inalteradas
CREATE TABLE update_test2 (
col1 text NOT NULL PRIMARY KEY,
col2 text,
col3 text
);
INSERT INTO update_test2 VALUES ('a1', 'a2', 'a3'), ('a11', 'a22', 'a33');
-- Update col2 only; col3 is unchanged
UPDATE update_test2 SET col2 = 'tom' WHERE col1 = 'a1';
Resultado:
col1 | col2 | col3
------+------+------
a1 | tom | a3
a11 | a22 | a33
(2 rows)
Também é possível escrever a mesma atualização parcial usando INSERT ON CONFLICT:
INSERT INTO update_test2 (col1, col2) VALUES ('a1', 'tom')
ON CONFLICT (col1) DO UPDATE
SET col2 = EXCLUDED.col2;
Perguntas frequentes
Por que o uso de armazenamento aumenta durante um UPDATE e diminui logo depois?

Durante um UPDATE, o Hologres marca os dados antigos para exclusão e libera imediatamente os novos dados em pequenos arquivos. Os dados antigos marcados e os novos arquivos coexistem até a execução da compactação em segundo plano. A compactação mescla os novos dados, limpa os antigos e consolida os pequenos arquivos, normalizando o uso de armazenamento. Consulte Funcionamento para mais detalhes.