OLTP y OLAP
En resumen: OLTP son las muchas consultas pequeñas de una aplicación como una caja registradora, y OLAP son las pocas consultas grandes de informes que leen todas las filas.
Problema
La caja y la contabilidad
La base de datos de la tienda hace a la vez dos trabajos muy distintos. El cliente en la caja pregunta por un pedido y quiere la respuesta enseguida. El dueño el lunes por la mañana pregunta «cuánto vendimos por mes y por categoría», y eso necesita todos los pedidos del año.
Las primeras son miles por minuto, pequeñas y por clave. Las segundas son unas pocas al día, pero cada una lee todo. Una misma base de datos rara vez es buena en las dos cosas. Por eso hay distintos tipos de bases de datos, y de ellos trata este módulo.
La idea
OLTP: muchas consultas pequeñas
OLTP (online transaction processing, procesamiento de transacciones en línea) es el trabajo de la caja: leer o cambiar unas pocas filas que conoces por la clave. Los productos del pedido 42:
El plan muestra que la base de datos no lee toda la tabla. Busca (SEARCH) con el índice de la clave primaria y va directa a las dos filas:
Las consultas OLTP también escriben. Una compra es una transacción: el pedido, su línea y el stock se escriben juntos o no se escribe nada:
Pruébalo
El cliente pregunta
El cliente llama por el pedido 15. Muestra su estado y su fecha (las columnas status y ordered_at).
Solución
SELECT status, ordered_at FROM orders WHERE id = 15;WHERE id = 15: el número del pedido es la clave primaria, y la base de datos va directa a la fila. customer_id = 15 busca los pedidos del cliente 15, y esa es otra pregunta. La comprobación también mira el plan: una consulta que lee toda la tabla no pasa.
La idea
OLAP: pocas consultas grandes
OLAP (online analytical processing, procesamiento analítico en línea) es el trabajo del análisis: reunir, agrupar y comparar muchas filas. Los ingresos por mes de 2026:
Una clave no ayuda aquí. Necesita todas las filas de pedidos, así que el plan empieza con SCAN:
Con 152 filas es instantáneo. Con 50 millones de filas el informe lee gigabytes y carga el disco, la memoria y el procesador durante minutos. Mientras tanto, la caja espera. Y un índice no ayuda, porque el informe quiere todo de todos modos.
La idea
El almacén de datos
La solución es que los informes no toquen la base de datos del sitio. Cada noche un programa copia los datos a una base de datos aparte para el análisis, llamada almacén de datos (data warehouse). La copia se llama ETL: extract, transform, load (extraer, transformar, cargar).
Durante la transformación las tablas suelen fundirse en una tabla ancha: todo sobre una venta en una fila. Eso es desnormalización, que en la base de datos del sitio sería un error: el nombre del producto se repite en cada fila. Aquí es a propósito, porque los datos solo se leen y el informe no necesita JOIN. CREATE TABLE … AS SELECT crea una tabla nueva a partir del resultado de una consulta:
Los pedidos cancelados se quitan ya al copiar, para que los informes no tengan que acordarse de ellos.
Más precisamente, para curiosos
Los almacenes de datos reales (ClickHouse, BigQuery, Snowflake, Amazon Redshift) guardan los datos por columnas, no por filas. Un informe de ingresos lee solo las columnas day, category y amount y se salta el resto. Para eso sirve la lección sobre las bases de datos columnares. La tabla ancha suele ser una «tabla de hechos» con pequeñas tablas de consulta a su alrededor (dimensiones: fecha, producto, tienda), y el conjunto se llama esquema en estrella.
Pruébalo
Un informe por categoría
De la tabla sales: los ingresos por categoría de 2026 (las columnas category y revenue, redondeados al céntimo), del mayor hacia abajo.
Solución
SELECT category, ROUND(SUM(amount), 2) AS revenue
FROM sales
WHERE day >= '2026-01-01'
GROUP BY category
ORDER BY revenue DESC;SUM(amount) con GROUP BY category y WHERE day >= '2026-01-01'. Sin la condición del año, la suma es de todo el tiempo, desde septiembre de 2025. En sales no hay JOIN: la categoría ya está en la fila.
Ejercicio
Cuántos pedidos por ciudad
De la tabla sales: cuántos pedidos hay de cada ciudad (las columnas city y orders), de más a menos y, en caso de empate, por el nombre de la ciudad. Un cliente sin ciudad es una fila con NULL.
Solución
SELECT city, COUNT(DISTINCT order_id) AS orders
FROM sales
GROUP BY city
ORDER BY orders DESC, city;COUNT(DISTINCT order_id). En la tabla ancha cada fila es un producto de un pedido, y un pedido con tres productos son tres filas. COUNT(*) cuenta las filas y da 50 para Sofía, mientras que los pedidos son 23. Este es el error más común con las tablas anchas.
La idea
El tipo de datos y el tipo de pregunta
OLTP y OLAP son la primera división. Las demás salen de cómo son los datos y de qué les preguntas. Cada lección del módulo es una pareja así, y la mayoría tienen un simulador de la base de datos real en el navegador:
| Los datos y la pregunta | Tipo de base de datos | Ejemplos |
|---|---|---|
| Obtengo por clave, rápido, a menudo | clave-valor | Redis, Valkey, DynamoDB |
| Un documento entero con partes anidadas | documental | MongoDB |
| Qué ocurrió y en qué orden | flujo de eventos | Kafka, Redpanda |
| Quién está conectado con quién, en cuántos pasos | de grafos | Neo4j |
| Sumas sobre millones de filas, a lo largo del tiempo | columnar, series temporales | ClickHouse, TimescaleDB |
| Palabras en un texto | búsqueda de texto completo | Elasticsearch, OpenSearch |
| Parecido en significado | vectorial | pgvector, Qdrant |
| Más datos y consultas de los que cabe en un servidor | clúster | replicación, sharding |
Al final está la lección de cómo elegir. La respuesta casi siempre es: una base de datos relacional para la verdad y otro tipo a su lado solo para la pregunta en la que ella es débil.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: ACID: todo o nada · BEGIN, COMMIT, ROLLBACK · Índices · EXPLAIN: el plan de la consulta
- Continúa en: Clave-valor y la caché · Bases de datos de grafos · Bases de datos columnares y series temporales · Cómo elegir una base de datos
- Ejercicios sobre el tema: Tipos de bases de datos