Base de Datos - Optimización Resolución ejercicio 1 - Clase Práctica Nº 1 (08/10/2010) Se tienen las siguientes relaciones: ALUMNO(nroMatricula, nombre, dirección, localidad, provincia, teléfono, email, fecha_nacimiento, fecha_ingreso, carrera) INSCRIPCION_CURSADA (codMateria, nroMatricula , fecha_inscr, cuatrim, estado) Se cuenta además con la siguiente información: - ALUMNO tiene 5.000 tuplas - INSCRIPCION_CURSADA tiene 100.000 tuplas - El tamaño de los bloques es de 4096 bytes - Cada atributo ocupa 24 bytes - Hay 100 materias diferentes - El 20 % de los alumnos ingresaron desde el año 2009 en adelante. - El 10 % de los alumnos ingresaron en el año 2009 - El 5 % de las inscripciones en cursadas está en estado “Inscripto” - En la facultad hay 5 carreras. Ejercicio 1.Dadas las siguientes consultas, se pide para cada una de ellas: Generar árbol canónico y analizar su optimización. Calcular los bloques necesarios para materializar el output. Generar un plan de ejecución y calcular los costos de la evaluación de la consulta para cada uno de los siguientes escenarios según método de acceso / organización de archivo: i.Heap ii. Ordenado según la clave de búsqueda iii. Índice Hash según la clave de búsqueda, max bloques por balde 4 iv. Árbol B+ no clustered según la clave de búsqueda, altura 3. v. Árbol B+ Clustered según la clave de búsqueda, altura 3 En los árboles B+, asumir que todos los punteros a datos entran en una hoja. Las consultas a analizar son: a) SELECT nombre, dirección FROM ALUMNO b) SELECT nombre, dirección FROM ALUMNO WHERE nro Matricula = 1520 c) SELECT nombre, dirección FROM ALUMNO WHERE fecha_ingreso >= ‘01/01/2009’ 1 de 12 d) SELECT nroMatricula, fecha_inscr, estado FROM INSCRIPCION_CURSADA WHERE codMateria = 5 RESOLUCIONES Repasemos… Archivos Heap: Los archivos Heap son el tipo de archivo más simple, que consiste de una colección desordenada de registros, agrupados en bloques. Archivos Ordenados: Los archivos ordenados contienen los registros ordenados de acuerdo a los valores de determinados campos (la clave de ordenamiento). Árboles B+ Clustered: son árboles B+ de orden d, ordenados por un conjunto no vacío de campos (clave del índice), para los cuales el archivo de datos asociado está ordenado en el mismo orden que el índice. En el modelo que usamos en la materia, los registros de datos no forman parte del índice, es decir, las hojas del árbol tienen punteros al archivo de datos. Árboles B+ No Clustered: son similares a los B+ Clustered, salvo que el archivo de datos asociado no está ordenado en el mismo orden que el índice. Índice Hash Estático: Están compuestos por una cantidad determinada (fija) de baldes, donde la información asociada a una clave es ubicada a través de la utilización de una función de hash. Cada balde es una lista encadenada de bloques, los que se van agregando bajo demanda en la medida en que se completan los bloques previos de ese balde. En el modelo que usamos en la materia, los registros de datos no forman parte del índice, es decir, los bloques de cada balde tienen punteros al archivo de datos. Para entrar en calor… ¿Cuántos bloques ocupan las relaciones? Veamos los bloques ocupados por ALUMNO… LA = atribA * Latrib = 10 * 24 bytes =240 bytes FBA = [LB / LA+ = *4096 / 240+ = *17.06…+ = 17 tuplas por bloque BA = [TA / FBA]exceso = [5000 /17]exceso = *294.11…+exceso = 295 bloques Veamos los bloques ocupados por INSCRIPCION_CURSADA… LIC = atribIC * Latrib = 5 * 24 bytes =120 bytes FBIC = [LB / LIC+ = *4096 / 120+ = *34.13…+ = 34 tuplas por bloque BIC = [TIC / FBIC]exceso = [100000 /34]exceso = *2941.17…+exceso = 2942 bloques El factor de bloqueo es un concepto muy importante. Notar que si hubiésemos hecho las cuentas sin calcular el factor de bloqueo (BIC = TIC * LIC / LB), nos hubiese dado otro resultado (por ej, INSCRIPCION_CURSADA: 2930 bloques) que está mal. 2 de 12 EJ 1 a) SELECT nombre, dirección FROM ALUMNO Árbol Canónico y posible optimización: nombre, direccion ALUMNO No se pueden aplicar mejoras algebraicas. Tamaño del Output TQ = TA = 5000 LQ = atribQ * Latrib = = 2 * 24 = 48 FBQ = [LB / LQ] = [4096 / 48] = [85,...] = 85 BQ = [TQ / FBQ]exceso = [5000/ 85]exceso = [58,8... ]exceso = 59 Bloques Output = 59 Plan de Ejecución y costo Hay que recorrer todo el archivo, los índices no aportan nada... El único plan relevante utiliza filescan… nombre, direccion ALUMNO filescan filescan CIQ = CI = BA = 295 accesos Recordemos que el cálculo de costos tiene por objeto la comparación entre planes equivalentes, y para ello el cálculo del output final no es relevante (ya que todos los planes producirán igual salida final). Por eso no tenemos en cuenta el costo del output final en el cálculo de costo de la consulta. 3 de 12 EJ 1 b) SELECT nombre, dirección FROM ALUMNO WHERE nro Matricula = 1520 Árbol Canónico y posible optimización: nombre, direccion nroMatric=1520 ALUMNO No se pueden aplicar mejoras algebraicas. Las modificaciones algebraicas aplicables podrían agregar proyecciones a la salida de los operadores, pero el único operador al que aplicaría (la selección) ya tiene una proyección a continuación. Tamaño del Output TQ = 1 LQ = 48 (calculado en ej. 1a) FBQ = 85 (calculado en ej. 1a) exceso BQ = [TQ / FBQ] = [1/ 85]exceso = [0,01... ]exceso = 1 Bloques Output = 1 4 de 12 Plan de Ejecución N°1 (usando archivo heap) y costo Como suponemos que no hay índices disponibles, accederemos a la tupla buscada recorriendo todo el archivo de datos (recordemos que asumimos peor caso). nombre, direccion pipeline nroMatric=1520 ALUMNO filescan Calculemos los costos… CQ = CI + CO + CI Como CO = CI= 0 (por utilizar pipeline) CQ = CI = BA = 295 accesos Plan de Ejecución N°2 (considerando archivo ordenado según nroMatricula) y costo Como suponemos que el archivo de datos está ordenado por la misma clave de búsqueda, accederemos a la tupla buscada mediante búsqueda binaria. nombre, direccion pipeline nroMatric=1520 ALUMNO BusqBin Calculemos los costos… CQ = CI + CO + CI CO = CI= 0 (por utilizar pipeline) CI = [log2(BA) ]exceso + B’ Como es búsqueda por igualdad sobre una clave candidata, B’ (la cantidad de bloques necesarios para acceder a todas las tuplas que cumplen la condición) no se considera... luego: CQ = CI = [log2(BA) ]exceso = [log2(295) ]exceso = [8,2...] exceso = 9 accesos 5 de 12 Plan de Ejecución N°3 (considerando índice hash según nroMatricula) y costo Llamemos IH al índice hash de ALUMNO sobre nroMatricula. Como coincide con la clave de búsqueda y se trata de una búsqueda por igualdad, lo utilizaremos para acceder a la tupla buscada. nombre, direccion pipeline nroMatric=1520 ALUMNO IH Recordemos que el acceso a datos utilizando índice hash requiere: o identificar el balde correspondiente a la clave (sin costo, es un cálculo) o recorrer todos los bloques del balde para encontrar los punteros correspondientes a las tuplas que coinciden con la clave buscada (asumimos peor caso, por eso recorremos todos) o acceder a los bloques de datos que contienen las tuplas buscadas. Como asumimos peor caso, se requerirá acceder a tantos bloques de datos como tuplas busquemos (esto no quiere decir que todos los bloques que accedamos sean distintos, sólo es una estimación basada en el peor caso posible) Calculemos el costo… CQ = CI + CO + CI CO = CI= 0 (por utilizar pipeline) CI = MaxBloqXB + T’ De los datos de entrada sabemos que la cantidad de bloques por balde es 4. Como es búsqueda por igualdad sobre una clave candidata, T’ es 1... luego: CQ = CI = 4 + 1 = 5 accesos 6 de 12 Plan de Ejecución N°4 (considerando índice B+ No Clustered según nroMatricula) y costo Llamemos INC al índice B+ No Clustered de ALUMNO sobre nroMatricula. Como coincide con la clave de búsqueda, lo utilizaremos para acceder a la tupla buscada. nombre, direccion pipeline nroMatric=1520 ALUMNO INC Recordemos que el acceso a datos utilizando índice B+ No Clusterizado requiere: o Acceder al nodo hoja del árbol correspondiente a la clave, esto es, bajar en el árbol desde la raíz hasta una de sus hojas. Cada nodo ocupa un bloque. Tenemos tantos accesos como niveles tenga el árbol. o Recorrer nodos hoja del árbol para encontrar los punteros correspondientes a las tuplas que coinciden con la clave buscada (por enunciado, asumimos que todos los punteros a datos correspondientes a una búsqueda entran en un único nodo hoja, por lo que no hay costo adicional, ya que el primer nodo hoja lo alcanzamos al bajar en el árbol). o Acceder a los bloques de datos que contienen las tuplas buscadas. Como asumimos peor caso, se requerirá acceder a tantos bloques de datos como tuplas busquemos (igual que antes, esto no quiere decir que todos los bloques que accedamos sean distintos, sólo es una estimación basada en el peor caso posible) Calculemos el costo… CQ = CI + CO + CI CO = CI= 0 (por utilizar pipeline) CI = H + T’ De los datos de entrada sabemos que la altura de los árboles B+ es 3. Como es búsqueda por igualdad sobre una clave candidata, T’ es 1... luego: CQ = CI = 3 + 1 = 4 accesos 7 de 12 Plan de Ejecución N°5 (considerando índice B+ Clustered según nroMatricula) y costo Llamemos ICL al índice B+ Clustered de ALUMNO sobre nroMatricula. Como coincide con la clave de búsqueda, lo utilizaremos para acceder a la tupla buscada. nombre, direccion pipeline nroMatric=1520 ALUMNO ICL Recordemos que el acceso a datos utilizando índice B+ Clusterizado requiere: o Acceder al nodo hoja del árbol correspondiente a la clave, esto es, bajar en el árbol desde la raíz hasta una de sus hojas. Cada nodo ocupa un bloque. Tenemos tantos accesos como niveles tenga el árbol. o Obtener el puntero a la primer tupla buscada (está en el nodo hoja alcanzado al bajar en el árbol, por lo cual no tiene costo adicional). Este puntero nos permitirá acceder al primer bloque de datos. Como el archivo de datos también está ordenado por la misma clave que el índice, entonces podremos obtener las tuplas buscadas recorriendo directamente los bloques contiguos del archivo de datos. o Acceder a los bloques de datos contiguos que contienen todas las tuplas buscadas. Para simplificar el cálculo, asumiremos que la primer tupla buscada está al principio de un bloque, con lo cual tendremos que levantar todos bloques completos, salvo el último que podría estar incompleto…) Calculemos el costo… CQ = CI + CO + CI CO = CI= 0 (por utilizar pipeline) CI = H + B’ De los datos de entrada sabemos que la altura de los árboles B+ es 3. Como es búsqueda por igualdad sobre una clave candidata, hay una sola tupla que cumple la condición de búsqueda, y por lo tanto ocupa un único bloque de datos... luego: CQ = CI = 3 + 1 = 4 accesos Resumiendo los costos del ejercicio 1b)... Heap Sorted 295 accesos 9 accesos Hash 5 accesos B+ No Clustered 4 accesos B+ Clustered 4 accesos Pregunta… ¿siempre la utilización del índice B+ Clustered para búsquedas por igualdad de clave da mejores resultados que la recorrida completa de todo el archivo? ¿Qué pasa con los índices B+ No Clustered o Hash? 8 de 12 EJ 1 c) SELECT nombre, dirección FROM ALUMNO WHERE fecha_ingreso >= ‘01/01/2009’ Árbol Canónico y posible optimización: nombre, direccion fechaIngr >=’01/01/2009’ ALUMNO Al igual que antes, no se pueden aplicar mejoras algebraicas. Las modificaciones algebraicas aplicables podrían agregar proyecciones a la salida de los operadores, pero el único operador al que aplicaría (la selección) ya tiene una proyección a continuación. Tamaño del Output TQ = TALUMNO * 20 % 1= 5000 * 20 / 100 = 1000 LQ = 48 (calculado en ej. 1a) FBQ = 85 (calculado en ej. 1a) exceso BQ = [TQ / FBQ] = [1000/ 85]exceso = [11,76... ]exceso = 12 Bloques Output = 12 Plan de Ejecución N°1 (usando archivo heap) y costo Como suponemos que no hay índices disponibles, accederemos a las tuplas buscadas recorriendo todo el archivo de datos (recordemos que asumimos peor caso) nombre, direccion pipeline fechaIngr >=’01/’1/2009’ ALUMNO filescan 1 El 20 % de los alumnos ingresaron desde el año 2009 en adelante. 9 de 12 Calculemos los costos… CQ = CI + CO + CI Como CO = CI= 0 (por utilizar pipeline) CQ = CI = BA = 295 accesos Plan de Ejecución N°2 (considerando archivo ordenado según fecha_ingreso) y costo Como suponemos que el archivo de datos está ordenado por la misma clave de búsqueda, accederemos a las tuplas buscadas mediante búsqueda binaria. nombre, direccion pipeline fechaIngr >=’01/’1/2009’ ALUMNO BusqBin CQ = CI + CO + CI CO = CI= 0 (por utilizar pipeline) CI = [log2(BA) ]exceso + B’ B’ es la cantidad de bloques de datos ocupados por las tuplas que cumplen la condición. Vemos esto… T’ (tuplas que satisfacen la condición) = 1000 L’ = LA = 240 (calculado al principio) FB’ = FBA = 17 (calculado al principio) B’ = [T’ / FB’]exceso = [1000/ 17]exceso = [58,82... ]exceso = 59 Luego CQ = CI = [log2(BA) ]exceso + B’ = [log2(295) ]exceso + 59 = [8,2...] exceso + 59= 68 accesos Plan de Ejecución N°3 (considerando índice hash según fecha_ingreso) y costo Los índices Hash sólo son aplicables a búsquedas por igualdad, por lo que en esta consulta no podemos utilizarlo… 10 de 12 Plan de Ejecución N°4 (considerando índice B+ No Clustered según fecha_ingreso) y costo Llamemos INC al índice B+ No Clustered de ALUMNO sobre fecha_ingreso. Como coincide con la clave de búsqueda, lo utilizaremos para acceder a las tuplas buscadas. nombre, direccion pipeline fechaIngr >=’01/’1/2009’ ALUMNO INC Calculemos el costo… CQ = CI + CO + CI CO = CI= 0 (por utilizar pipeline) CI = H + T’(consideramos que todos los punteros a las T’ tuplas entran en una hoja del índice) De los datos de entrada sabemos que la altura de los árboles B+ es 3. Como lo calculamos anteriormente, T’ = (cantidad de tuplas que cumplen la condición) = 1000 Luego: CQ = CI = 3 + 1000 = 1003 accesos Plan de Ejecución N°5 (considerando índice B+ Clustered según fecha_ingreso) Llamemos ICL al índice B+ Clustered de ALUMNO sobre fecha_ingreso. Como coincide con la clave de búsqueda, lo utilizaremos para acceder a las tuplas buscadas. nombre, direccion pipeline fechaIngr >=’01/’1/2009’ ALUMNO ICL 11 de 12 Calculemos el costo… CQ = CI + CO + CI CO = CI= 0 (por utilizar pipeline) CI = H + B’ De los datos de entrada sabemos que la altura de los árboles B+ es 3. Para simplificar el cálculo, asumiremos que la cantidad de bloques B’ = [T’ / FB’]exceso , donde T’ es la cantidad de tuplas que cumplen la condición y FB’ el factor de bloqueo correspondiente … B’ = [(T’) / FB’]exceso = [1000/ 17]exceso = 59 (el detalle del cálculo está en un ejercicio previo) Luego CQ = CI = H + B’ = 3 + 59 = 62 accesos Resumiendo los costos del ejercicio 1c)... Heap Sorted 295 accesos 68 accesos Hash N/A B+ No Clustered 1003 accesos B+ Clustered 62 accesos En este ejemplo se ve claramente que el uso de índices no necesariamente garantiza costos más bajos que la recorrida completa del archivo… EJ 1 c) SELECT nroMatricula, fecha_inscr, estado FROM INSCRIPCION_CURSADA WHERE codMateria = 5 Queda como ejercicio para ustedes… 12 de 12