Devido ao modelo MVCC do Postgres, e de acordo com as regras do SQL, um UPDATE
grava uma nova versão de linha para cada linha que não é excluída na WHERE
cláusula.
Isto faz ter um impacto mais ou menos substancial no desempenho, direta e indiretamente. "Atualizações vazias" têm o mesmo custo por linha que qualquer outra atualização. Eles acionam gatilhos (se presentes) como qualquer outra atualização, precisam ser registrados no WAL e produzem linhas mortas inchando a tabela e causando mais trabalho para VACUUM
mais tarde, como qualquer outra atualização.
As entradas de índices e as colunas TOASTed nas quais nenhuma coluna envolvida é alterada podem permanecer iguais, mas isso é verdade para qualquer linha atualizada. Relacionado:
É quase sempre uma boa ideia excluir essas atualizações vazias (quando houver uma chance real de que isso possa acontecer). Você não forneceu uma definição de tabela em sua pergunta (o que é sempre uma boa ideia). Temos que assumir que first_name
pode ser NULL (o que não seria surpreendente para um "primeiro nome"), portanto, a consulta deve usar uma comparação segura com NULL :
UPDATE users
SET first_name = 'Michael'
WHERE id = 123
AND first_name IS DISTINCT FROM 'Michael';
Se first_name IS NULL
antes da atualização, um teste com apenas first_name <> 'Michael'
seria avaliado como NULL e, como tal, excluiria a linha da atualização. Erro sorrateiro. Se a coluna estiver definidaNOT NULL
, use a verificação simples de igualdade, porque isso é um pouco mais barato.
Palavras-chave: