Eu tenho esta tabela:
CREATE TABLE fragment
(
fragment_id integer,
start_date timestamp without time zone,
end_date timestamp without time zone,
duration integer,
-- <10+ more columns>
revision_1 integer,
revision_2 integer
)
É bem grande: 44 milhões de linhas, 27 GB de espaço em disco. A taxa de inserção diária é de cerca de 70 mil linhas.
Os dados nesta tabela quase nunca são atualizados, exceto para as duas últimas colunas denominadas revision_1
e revision_2
. Eles são atualizados por meio de gatilhos definidos em outras tabelas relacionadas. As atualizações ocorrem com muita frequência, especialmente para novas linhas na fragment
tabela. Cada linha pode ser atualizada até 50-100 vezes. Linhas antigas (digamos com 1 semana), no entanto, param de ser atualizadas, pois são consideradas 'processadas'.
Tanto quanto eu sei, UPDATE
a operação no Postgres é implementada como algo como DELETE
+ INSERT
. Portanto, quando um valor em uma única coluna é atualizado, toda a linha é marcada como excluída e uma nova linha é criada. Acho que é por isso que minha fragment
mesa é aspirada todos os dias, o que leva várias horas.
A questão é: geralmente é uma boa ideia extrair 'colunas quentes' em uma tabela separada? Quero dizer algo assim:
CREATE TABLE fragment_revision
(
fragment_id integer,
revision_1 integer,
revision_2 integer
)