PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O Postgres reescreve a linha inteira na atualização?


Escolhendo c) de suas perguntas:

Como @Craig já explicou , as colunas que são "aptos para TOAST" e maiores que um determinado limite são armazenadas fora de linha em uma tabela TOAST dedicada por tabela ("bifurcações de relação" separadas, arquivos separados no disco). Portanto, um bytea de 5 MB A coluna permaneceria praticamente intocada em uma atualização se a própria coluna não fosse alterada. O manual:

A ênfase em negrito é minha.
A linha na bifurcação da relação principal ainda é copiada e uma linha morta fica para trás quando atualizada (se algum valor foi alterado ou não). Para tamanhos de linha grandes, a solução a seguir pode valer a pena:

Crie uma pequena tabela 1:1 separada para sinalizadores frequentemente alterados. Apenas a chave primária (=chave estrangeira ao mesmo tempo) e os sinalizadores alterados com frequência. Isso tornaria as atualizações muito mais rápidas e preservaria o espaço em disco - para uma sobrecarga inicial extra e algum custo para consultas que precisam unir as duas tabelas (outras consultas realmente ficam mais rápidas). Mais sobre o requisito de espaço em disco das linhas da tabela: