Tenho uma tabela de "transações" onde cada transação possui um valor: http://sqlfiddle.com/#!15/42849/1
Os registros na tabela nunca são REMOVE'ed ou UPDATE'ed. Apenas novas transações são adicionadas.
Desejo calcular a SOMA dos valores. O cálculo não precisa estar 100% atualizado para cada solicitação.
Em um conjunto de dados de cerca de um milhão de linhas, isso leva cerca de 400 ms no meu banco de dados. Isso é muito lento para o meu aplicativo e estou tentando encontrar a melhor solução para acelerar isso.
O que eu tentei até agora
- Visualização materializada: Adiciona a complexidade de ter um cronjob em execução que atualiza a visualização a cada X segundos.
- Cache no servidor de aplicativos: Cada solicitação X será lenta quando o cache precisar de uma atualização.
- Armazenando resultados de consultas em um subconjunto antigo: armazene a SOMA da solicitação anterior e use-a para calcular o total correto. Adiciona complexidade.
Pergunta
O PostgreSQL fornece uma solução para acelerar esse tipo de consulta?
Atualização 1
A consulta SUM é apenas uma soma básica em uma única coluna, então não acredito que essa consulta em si possa ficar mais rápida. A solução provavelmente é fazer algum tipo de cache/pré-cálculo ou similar. O PostgreSQL possui algum recurso nesse sentido?
Atualização 2
Tabela em questão:
CREATE TABLE transactions
(
id bigserial NOT NULL,
amount bigint NOT NULL
);
Consulta em questão:
SELECT SUM(amount) FROM transactions;
Atualização 3
Descobri que também preciso de um "tipo".
Tabela atualizada:
CREATE TABLE transactions
(
id bigserial NOT NULL,
amount bigint NOT NULL,
type int NOT NULL
);
Consulta atualizada:
SELECT SUM(amount) FROM transactions GROUP BY type;
SQL Fiddle: http://sqlfiddle.com/#!15/77e67/2