fundo
Um banco de dados local contém quase 1,3 bilhão de linhas exclusivas. Cada linha é indiretamente associada a uma latitude e longitude específica (local). Cada linha tem um carimbo de data.
Caso de Uso
O problema é o seguinte:
- O usuário define uma data de início / término e um intervalo de valores (por exemplo, 100 a 105).
- O sistema reúne todas as linhas que correspondem à data especificada, agrupadas por local.
- O desempenho do sistema determina os locais que, durante essas datas, têm uma probabilidade estatística de cair no intervalo de valores especificado.
- O sistema exibe todos os locais correspondentes ao usuário.
Este é um problema de velocidade e escala.
Questão
Qual é a arquitetura de solução mais barata que você pode imaginar que permitiria que esse sistema recuperasse resultados para os usuários em menos de cinco segundos?
Sistema atual
O ambiente é atualmente:
- PostgreSQL 8.4 (a atualização é possível; alternar bancos de dados não é uma opção)
- R e PL / R
- XFS
- WD VelociRaptor
- 8 GB de RAM (Corsair G.Skill; 1,3 GHz)
- Intel Core 7 Quad-core (2,8 GHz)
- Ubuntu 10.10
Atualizações de hardware são aceitáveis.
Atualização - Estrutura do Banco de Dados
Os bilhões de linhas estão em uma tabela semelhante a:
id | taken | location_id | category | value1 | value2 | value3
- id - chave primária
- taken - Data atribuída à linha
- location_id - referência à latitude / longitude
- categoria - Uma descrição dos dados
- valor1 .. 3 - Os outros valores que o usuário pode consultar
A taken
coluna é tipicamente datas consecutivas por location_id
, às vezes cada local possui dados de 1800 a 2010 (cerca de 77.000 datas, muitas delas duplicadas, pois cada local possui dados no mesmo período).
Existem sete categorias e as tabelas já estão divididas por categoria (usando tabelas filho). Cada categoria contém ~ 190 milhões de linhas. Num futuro próximo, o número de linhas por categoria excederá um bilhão.
Existem aproximadamente 20.000 locais e 70.000 cidades. Os locais são correlacionados à cidade por latitude e longitude. Atribuir cada local a uma cidade específica significa encontrar os limites da cidade, o que não é uma tarefa trivial.
Ideias
Algumas idéias que tenho incluem:
- Encontre um serviço de nuvem para hospedar o banco de dados.
- Crie uma faixa de ataque SSD (ótimo vídeo).
- Crie uma tabela que junte todos os locais por cidade (pré-cálculo).
Obrigado!
location_id
um geography
ou geometry
, ou se refere a uma segunda tabela? A location_id
coluna está indexada?