Universidad Nacional Autónoma de México: Administración de Bases de Datos
Universidad Nacional Autónoma de México: Administración de Bases de Datos
México
Grupo: 1702
Práctica 10
Instrucciones
1. Inserta 100,000 registros en la tabla Alumnos (en desorden) con sus respectivos registros en las otras
tablas.
2. Realiza la consulta SQL que genere el siguiente reporte:
Cuenta | Alumno | Carrera | Materia | Grupo | Calif | PromSem | PromFin
3. Valida el plan de ejecución de la consulta (punto 2) y determina si ulitiza índices. Comenta el plan.
4. Determina el tiempo de ejecución de la consulta (2) e índica si se puede mejorar con índices. Si es así,
optimízala y valida el plan de ejecución. comenta.
5. Crea e indica el índice necesario si en la consulta (2) se incluye la cláusula where promedio > 8 . Indica
qué hace la cláusula where agregada.
Verifica que en el plan de ejecución se utilice el índice creado.
Solución:
0. Primero creamos la estructura solicitada:
1. Luego, con el uso de python insertamos 100,000 registros en la tabla Alumnos y en las demás tablas. A
continuación se muestra parte del código en python:
Así, obtenemos los siguientes registros en las tablas:
2. Se realiza la consulta SQL que genera el siguiente reporte:
Cuenta | Alumno | Carrera | Materia | Grupo | Calif | PromSem | PromFin :
Podemos notar que la consulta se realiza en un tiempo de 3.888 segundos.
alumnos_pkey Nested Loop Inner Merge Inner Join Nested Loop Inner Nested Loop Inner Incremental Sort Window Aggregate Window Aggregate
Join Join Join
carreras_pkey Memoize
calif_pkey
materia_pkey Memoize
gpo_pkey Memoize
En la siguiente tabla se puede ver que se están realizando Index Scan con alumnos , carreras , calif ,
materia y gpo .
Además, obtenemos la siguiente información que confirma que el número de Index Scan es 5:
El plan de ejecución indicó que se están realizando escaneos en todas las tablas involucradas. Para optimizar
la consulta, podemos considerar agregar algunos índices a tablas relevantes. Primero, se agregaron índices a
las columnas que se utilizan en las cláusulas JOIN y en las cláusulas WHERE para mejorar el rendimiento.
Además, se crearon índices para la columna utilizada en la cláusula JOIN de Alumnos y JOIN de Calif:
Se obtiene el siguiente resultado en el tiempo de ejecución:
Se puede notar que la variación del tiempo fue mínima, por lo que, no hubo ningún efecto en usar índices.
Por otro lado, el plan de ejecución brindó la siguiente información:
idx_alumnos_cta Nested Loop Inner Merge Inner Join Nested Loop Inner Nested Loop Inner Incremental Sort Window Aggregate Window Aggregate
Join Join Join
carreras_pkey Memoize
idx_calif_cta
materia_pkey Memoize
gpo_pkey Memoize
Es decir, se siguen haciendo 5 Index Scan . Por lo tanto, el uso de índices no optimizó la consulta.
5. Primero, se crea el índice necesario para la consulta anterior, la cual, incluye la cláusula
where promedio > 8 :
Esta cláusula está filtrando los resultados de la consulta para incluir solo las filas donde el valor en la
columna Promedio sea mayor que 8. Es una condición de filtrado que restringe el conjunto de
resultados a solo aquellos registros que cumplen con esa condición específica. Así, al ejecutar la
consulta, obtenemos lo siguiente:
Se puede notar que el tiempo de ejecución fue mucho menor, dando 1.575 segundos. Además,
visualizando el plan de ejecución se obtiene lo siguiente:
calif Hash Inner Join Hash Inner Join Hash Inner Join Hash Inner Join Sort Window Aggregate Window Aggregate
alumnos Hash
carreras Hash
materia Hash
gpo Hash
En la siguiente imagen se puede ver como Index Scan cambió por Seq Scan :
Además, el número de Index Scan ahora es de 0:
Por lo tanto, el índice creado si se está utilizando. Mejorando el tiempo de ejecución de la consulta.