Antecedentes
Una base de datos local contiene casi 1.300 millones de filas únicas. Cada fila está asociada indirectamente con una latitud y longitud (ubicación) específicas. Cada fila tiene un sello de fecha.
Caso de uso
El problema es el siguiente:
- El usuario establece una fecha de inicio / finalización y un rango de valores (por ejemplo, 100 a 105).
- El sistema reúne todas las filas que coinciden con la fecha dada, agrupadas por ubicación.
- El sistema realiza determina las ubicaciones que, durante esas fechas, tienen una probabilidad estadística de caer en el rango de valores dado.
- El sistema muestra todas las ubicaciones coincidentes para el usuario.
Este es un problema de velocidad y escala.
Pregunta
¿Cuál es la arquitectura de solución menos costosa que pueda imaginar que permitiría que dicho sistema recupere resultados para los usuarios en menos de cinco segundos?
Sistema actual
El entorno es actualmente:
- PostgreSQL 8.4 (la actualización es posible; cambiar de base de datos no es una opción)
- R y PL / R
- XFS
- WD VelociRaptor
- 8 GB de RAM (Corsair G.Skill; 1.3 GHz)
- Quad Core Genuino Intel 7 (2.8 GHz)
- Ubuntu 10.10
Las actualizaciones de hardware son aceptables.
Actualización: estructura de la base de datos
Los miles de millones de filas están en una tabla similar a:
id | taken | location_id | category | value1 | value2 | value3
- id: clave principal
- tomado - Fecha asignada a la fila
- location_id - Referencia a la latitud / longitud
- categoría: una descripción de los datos
- valor1 .. 3 - Los otros valores que el usuario puede consultar
La taken
columna suele tener fechas consecutivas por location_id
, a veces cada ubicación tiene datos de 1800 a 2010 (aproximadamente 77,000 fechas, muchas de ellas duplicadas ya que cada ubicación tiene datos en el mismo rango de fechas).
Hay siete categorías y las tablas ya están divididas por categoría (usando tablas secundarias). Cada categoría contiene ~ 190 millones de filas. En el futuro cercano, el número de filas por categoría superará los mil millones.
Hay aproximadamente 20,000 ubicaciones y 70,000 ciudades. Las ubicaciones están correlacionadas con la ciudad por latitud y longitud. Asignar cada ubicación a una ciudad en particular significa encontrar los límites de la ciudad, lo cual no es una tarea trivial.
Ideas
Algunas ideas que tengo incluyen:
- Encuentre un servicio en la nube para alojar la base de datos.
- Cree una banda de incursión SSD (excelente video).
- Cree una tabla que amalgame todas las ubicaciones por ciudad (cálculo previo).
¡Gracias!