O PostgreSQL suporta algum tipo de índice esparso que seria útil para indexar apenas o primeiro e o último valor da tabela, com base em uma determinada chave?
Considere os seguintes dados:
CREATE TABLE samples (
device_id int not null;
ts timestamp not null;
value real not null;
);
Agora, vamos supor que eu tenha milhões de dispositivos e cada um possa ter bilhões de amostras. Eu quero acessar todos esses dados - se o acesso for lento, não me importo. No entanto, estou especialmente interessado em acessar o primeiro e o último valor por ts
timestamp: (device_id, value) muito, rápido. Isso para saber qual é o intervalo de amostras para um dispositivo específico.
Eu posso construir uma lógica de gatilho/aplicativo que gerencie uma tabela separada onde as informações são armazenadas:
CREATE TABLE first_last_samples (
device_id int not null;
first_ts timestamp not null;
first_value real not null;
last_ts timestamp not null;
last_value real not null;
);
No entanto, gerenciar a lógica para armazenar em cache o primeiro/último item parece um pouco desajeitado. Estou perguntando se o PostgreSQL gerenciaria algum tipo de índice especial, talvez por extensões, o que me permitiria resolver esse problema no nível de definição de tabela/exibição/índice?
Como existem bilhões de pontos de dados, colocar todos eles no índice não parece fazer sentido se você estiver interessado apenas no primeiro e no último.
Se seus padrões de acesso não divulgados e/ou outras restrições não permitirem a
MATERIALIZED VIEW
ou uma solução de gatilho manter uma tabela com min/max perdevice_id
atualizada, a ferramenta padrão mais próxima pode ser um índice BRIN , que é muito menor que um correspondente Índice de árvore B, normalmente por várias ordens de magnitude. Mas sua eficiência também depende da distribuição de dados não divulgados em sua tabela. Ver: