Tenho uma tabela de observações de sensores com obs_ts timestamp, sensor_id text, sensor_val int
, e para preencher lacunas com dados temos modelos por dia da semana e hora do dia: model_id int, hour_of_day int, model_val int
.
Para preencher os valores ausentes, juntaríamos essas duas tabelas por meio de uma tabela de cruzamento que é:sensor_id text, day_of_week int, model_id int
Se nossa tabela de observações for enorme, qual seria uma maneira ideal de indexá-la para unir isodow
e hour
. A indexação de um carimbo de data/hora também indexa funções como EXTRACT(isodow FROM obs_ts)
ou devo tornar esses índices funcionais explícitos, por exemplo CREATE INDEX ON observations (EXTRACT isodow FROM obs_tx)
. Para ingressar na hora, seria melhor converter o hour_of_day
para um timerange
?
Por sugestão de Verace, criei uma tabela de teste com 10 milhões de registros. O TLDR: Índices em funções de data e hora precisam ser explícitos, qualquer conversão dessa coluna de data e hora para junção/filtragem não será atendida por um índice.
O tamanho da tabela é de 1,7 GB. Todos os índices são 214 MB. Dos meus testes, o índice
obs_ts
nunca é usado (provavelmente porque essas comparações envolvem a alteração do tipo de dados da coluna timestamp...). Os índices específicos da função são usados, portanto, há definitivamente uma troca de tamanho de índice de desempenho.Dia da semana
Hora do dia