#+title: Autoevaluacion
#+author: Luca Troiano, Federico Polidoro

* Pensar como el motor de BD 
** ¿Cual es el orden lógico de ejecución de esta consulta?

#+begin_src sql

SELECT *
FROM vuelos
WHERE YEAR(fecha_salida) = 2023
AND destino = 'Madrid'
ORDER BY hora_salida;

#+end_src


Lo que realiza la base de datos es primero traer todos los datos de la tabla, despues los filtra por año, luego por el lugar de destino y finalmente, los ordena por la hora de salida de los vuelos.

** ¿Qué operaciones de álgebra relacional están presentes?

El filtrado por fecha de salida y el destino, Por lo que utiliza: Seleccion e Interseccion.

** ¿Qué parte del WHERE no puede usar índices? ¿Por qué?

la parte de la funcion YEAR() porque la funcion se computa en momento de ejecucion. osea no puede usar indice porque el dato a buscar no existe hasta dsps de usar el ~YEAR()~.

** ¿Qué pasará si no hay índice sobre destino ni fecha_salida? 
Se tendria que hacer un escaneo de tabla entera para ambos casos.

* Pensar como DBA
** Reescribí la consulta de forma optimizada:
- Sin SELECT *  
- Evitando funciones en el WHERE  
- Evaluando si ORDER BY es necesario  

#+begin_src sql
SELECT destino, origen, fecha_salida, hora_salida, aerolinea, estado
FROM vuelos
WHERE fecha_salida >= '2023-01-01' AND fecha_salida <= '2024-01-01'
AND destino = 'Madrid';
#+end_src

El order by no es necesario, en caso de existir un indice fisico con la hora_salida. También es justificable que como esto se va a usar en un informe no es tan necesario que se ordene en la base de datos.

** ¿Qué índice crearías? Justificá:
Crearia unos en fecha_salida y destino. Esto para optimizar la recuperacion de datos mediante un indice fisico que los ordene a los datos, como por ejemplo, lo haria un ~B-tree~ .

** ¿Qué tipo de optimización estás aplicando?
Estoy utilizando ambos tipos de optimización:

- Por costos \\
Se podria considerar elejir las columnas de las tablas. 

- Heuristica \\
Cuando decidimos poner indices en ambas columnas que usamos en el WHERE.
