En 2013 publiqué el libro «Optimización SQL en Oracle«.
Hasta entonces, cuando impartía formación en SQL o PL/SQL, las tablas “universales” EMP y DEPT me bastaban para demostrar prácticamente todo.
El problema vino cuando empecé a necesitar ejemplos con algo más de volumen, en los que necesitaba manejar cardinalidades reales, estimaciones y planes de ejecución con cambios significativos en el coste.
Ahí fue cuando decidí crear un modelo desde cero, con datos sintéticos, y que estuviera abierto a cualquiera que quisiera usarlo.
No quise hacer el típico dataset de e-commerce. Quería algo que pudiera evolucionar hacia un futuro Data Warehouse y que también me permitiera mostrar ejemplos analíticos (por ejemplo).
Y para eso necesitaba meterle bastantes filas al modelo.
Al final recuperé un dataset que había creado años atrás para unas conferencias tecnológicas en Pamplona.
En aquella charla recorría todo el ciclo de vida de una aplicación, desde el origen hasta la explotación de los datos históricos a lo largo del tiempo. En aquella charla hice una demostración “todo en uno” de:
- la creación del análisis y modelo físico (Oracle Designer 2000),
- una aplicación con Oracle Forms e informes con Oracle Reports,
- los ETL que enviarían datos a un Data Warehouse con Oracle Warehouse Builder,
- la posterior explotación multidimensional con cubos OLAP (Oracle Discoverer),
- y hasta predicción de patrones con Oracle DataMiner.
Aquel modelo lo llamé VUELOS.
¡Oye tú, y ni tan mal!
Así que me decidí a usarlo en el libro para explicar planes de ejecución, estadísticas, cardinalidad, selectividad y el comportamiento del optimizador con cierta profundidad.
Durante años estuvo disponible como un simple export versión 9i. Cuando aún no existía Data Pump.
Lo he publicado completo
Lo he publicado completo
Por fin me he decidido a publicarlo en GitHub, con todo el código necesario para generarlo desde cero:
👉 https://github.com/CafeDatabase/vuelos-dataset
He revisado los scripts, corregido pequeños gazapos terribles (nada de “Washintong” o “Lion”), he normalizado nombres ficticios de compañías, validado códigos IATA reales y añadido un pequeño validador final para asegurar que la generación cumple unos mínimos.
¿Por qué ese validador?
Porque el modelo tiene un componente deliberadamente aleatorio. Lo diseñé así a propósito, para generar cierto grado de skew y que, en la parte de Data Mining, pudieran aparecer patrones ocultos fruto del azar.
En la carga que hice para aquella conferencia, y que utilicé también en el libro, ocurrió algo bastante simpático:
Los clientes HOMBRES, con estado civil CASADO, parecían preferir viajar a ROMA.
Y en la conferencia, obviamente, soltaba la predicción: “Los casados van a Roma”.
A ver, no siempre ocurre. Es aleatorio. Y eso también forma parte del aprendizaje. Es posible que, cuando tú generes este modelo, te aparezca alguna coincidencia distinta… o ninguna.
¿En qué consiste este dataset?
Es un modelo sintético orientado a rendimiento, con:
- 57.711 vuelos (vuelo arriba, vuelo abajo)
- 171.113 reservas (más o menos)
- 2.885.550 plazas (aprox.)
- 34 aeropuertos activos
- 102 agencias con reservas
- Distribuciones controladas y cierto grado de skew
En realidad, no está pensado para ser “realista” desde el punto de vista funcional. Está pensado para ser útil desde el punto de vista didáctico.
Y eso es muy distinto. No hay que verlo como el modelo que siguen las aerolíneas reales.
Probablemente no mezclen información de clientes con agencias ni compartan ventas entre compañías, pero para dar clases sobre modelos entidad-relación y ver un esquema de base de datos un poco más voluminoso, creo que es ideal. Al menos, gracias a él, pude generar ejemplos que visualizaran los impactos de productos cartesianos, ordenaciones innecesarias, costes significativamente distintos entre planes de acceso, etc.
¿Por qué hacerlo público ahora?
Por dos razones:
- Porque estoy trabajando en la segunda edición del libro “Optimización SQL en Oracle”
- Porque voy a dirigir un Máster de Optimización SQL en Oracle en la Academia de Café Database.
La cuestión es que, en todo lo que hago, siempre intento que una parte de mi trabajo sea una contribución abierta a la comunidad. Ya lo hice con la primera edición del libro y el dataset se llevó miles de descargas.
Además, me pasó una cosa: intenté buscar un dataset abierto, con datos sintéticos, pero sencillo sólo con fines educacionales… y no lo encontré.
Encontré datasets con modelos complejos, y yo lo que quería era poder seguir estos principios:
- Que el ejemplo sea sencillo.
- Que involucre el mínimo de tablas/objetos posibles.
- Que el resultado sea visualmente identificable.
No quería utilizar un dataset médico y que los lectores tuvieran que desenredar el modelo relacional en cada ejemplo que usara. O que la diferencia entre ordenar 10 filas, hacer un hash de 10 filas o un nested loops de 10 filas diera como resultado el mismo coste.
Así pues, este dataset tiene sólo tablas sencillas: CLIENTES, RESERVAS, VUELOS, PLAZAS, CIUDADES, PAISES, AGENCIAS…
Cuanto más sencillo sea el ejemplo, más potente es el aprendizaje.
Y me sorprendió que, con mínimas variaciones, pude cubrir casi todos los ejemplos del libro en los que el optimizador estima cardinalidades erróneas, planes de ejecución adaptativos y selectividades no uniformes…
Y acabé bastante satisfecho, la verdad.
Por no decir que acabo de añadir una ligera mejora con las plazas y la capacidad de los vuelos para hacer un tutorial muy chulo sobre las SQL Assertions (próximamente).
¿Qué puedes hacer con el dataset?
- Practicar SQL y PL/SQL.
- Subirlo a una Autonomous Free Tier si no quieres montar un servidor.
- Usarlo en clases.
- Construir un prototipo en APEX.
- Crear una aplicación demo para tu portfolio.
- … lo que te dé la gana.
Si eres docente, tienes tablas variadas con datos suficientes para sacar totales de un volumen considerable, y si el modelo relacional es muy grande, puedes verlo de forma más atómica: clientes y su información de cliente, o solamente los vuelos de un aeropuerto a otro (sin entrar en las reservas), o calcular ingresos por agencias en ventas de vuelos… todo ello accediendo a muy pocas tablas y creando juegos de SQL sencillos y fáciles de explicar.
O si estás aprendiendo APEX, o a programar con cualquier entorno de programación que requiera un conjunto de datos en base de datos, pues con esto te da para un buen prototipo. ¡Yo encantado de que en tu portfolio presentes una aplicación demo con los datos de este dataset!
Para mí no es solo un repositorio. Es parte de mi método.
Si lo usas y detectas mejoras, o si quieres proponer escenarios interesantes para probar, estaré encantado de leerte.
Este año voy a estar muy centrado en optimización SQL. El libro, el Máster… y este dataset son tres piezas del mismo engranaje.
Y el dataset está completamente abierto.
Ahí lo tienes.