Facultad de Iformática Uiversidad Complutese de Madrid 4/9/2007 Exame de Ficheros y bases de datos (cód. 520) Igeiería Técica e Iformática de Gestió Covocatoria de septiembre II Parcial ) (,4 putos) Cosidérese u árbol B+ co 4. a) (0,7 putos) Cuál es el míimo úmero de odos ecesarios para alojar 2 valores diferetes de la clave? Dibújese el árbol resultate. Co 4 se puede alojar -3 valores de la clave por odo. Como todos los valores se 2 4 debe represetar e los odos hoja, so ecesarios 3 odos hoja. Como restriccioes que debe cumplir este árbol se tiee: El odo raíz tiee etre y 4 hijos. 4 2 Cada odo itero tiee etre 2 hijos y 4. 4 2 Los odos hoja cotiee etre 2 y 4-3 valores. E este caso, el odo raíz puede aputar a todos los odos hoja porque (úmero de puteros por odo) es 4. No es posible estructuralmete usar u úmero meor de odos. La estructura es (dode los espacios ocupados para valores de la clave se sombrea e gris): b) (0,7 putos) Respódase el apartado a) para 3 valores y determíese el úmero de valores y puteros si usar. Calcúlese el porcetaje de ocupació supoiedo que u valor de la clave ocupa igual que u putero. 3 5 E este caso so ecesarios 3 odos hoja. Como el odo raíz o puede aputar a todos ellos como e el apartado a), es ecesario añadir u ivel adicioal, que ecesariamete cotedrá u odo raíz, dos odos iteros y 5 odos hojas, el meor úmero de odos posible.
Facultad de Iformática Uiversidad Complutese de Madrid 4/9/2007 Fichero de datos Cada odo tiee 3 valores y 4 puteros, hay 8 odos, e total (3+4)*856 valores y puteros, de los cuales o se usa 7 valores y 7 puteros (4). Por lo tato, el porcetaje de 56 4 75% ocupació es 56 2) (2, putos) Dado el esquema Empleados(Nombre, DNI, Sueldo), Teléfoos(DNI, Teléfoo), Domicilios(DNI, Calle, Código postal), Códigos postales(código postal, Població, Provicia), se pide formular cosultas e Oracle para: a) (,2 putos) Cosulta SQL para listar todos los empleados (idepedietemete de que tega o o domicilios o teléfoos asociados) que muestre Nombre, DNI, Calle, Població, Provicia, Código postal, Teléfoo co las dos sitaxis (clásica de Oracle y estádar ANSI) para las reuioes (joi). Co la sitaxis estádar para las reuioes. SELECT Nombre, DNI, Calle, Població, Provicia, "Código postal", Teléfoo FROM (((Empleados NATURAL LEFT OUTER JOIN Teléfoos) NATURAL LEFT OUTER JOIN (Domicilios NATURAL INNER JOIN "Códigos postales"))); Co la sitaxis clásica de Oracle para las reuioes. SELECT Nombre, Empleados.DNI, Calle, Població, Provicia, Domicilios."Código postal", Teléfoo FROM Empleados, Domicilios, "Códigos postales", Teléfoos WHERE Empleados.DNITeléfoos.DNI(+) AND Empleados.DNIDomicilios.DNI(+) AND Domicilios."Código postal""códigos postales"."código postal"(+); E ambos casos, el resultado es el mismo: NOMBRE DNI CALLE POBLACIÓN PROVINCIA Códig TELÉFONO --------------- --------- ------------------- ----------- ---------- ----- --------- Atoio Arjoa 2345678A Avda. Complutese Madrid Madrid 28040 Atoio Arjoa 2345678A Cátaro 28004 Carlota Cerezo 2345678C 6 Carlota Cerezo 2345678C 93 Laura López 2345678L Diamate Peñarroya Córdoba 4200 93333333 Pedro Pérez 2345678P Carbó Lucea Córdoba 4900 644444444 6 filas seleccioadas. b) (0,9 putos) Cosulta SQL para icremetar e u 0% el sueldo de todos los empleados de forma que o se supere e igú caso 2.00, pero asegurado que se pueda deshacer el cambio (si usar retrocesos de trasaccioes). Escríbase tambié la solució que permita deshacer el cambio.
Facultad de Iformática Uiversidad Complutese de Madrid 4/9/2007 Es ecesario aotar las tuplas cambiadas. Para ello recurrimos a ua tabla, que se defie como: CREATE TABLE Cambios(DNI CHAR(9) PRIMARY KEY, Sueldo NUMBER(6,2)); A cotiuació se aota el cambio y se realiza la modificació: DELETE FROM Cambios; INSERT INTO Cambios SELECT DNI, Sueldo FROM Empleados WHERE Sueldo*. < 200; UPDATE Empleados SET Sueldo Sueldo*. WHERE Sueldo*. < 200; Para recuperar el cambio realizado: UPDATE Empleados SET Sueldo (SELECT Cambios.Sueldo FROM Cambios WHERE Cambios.DNIEmpleados.DNI); 3) (2,9 putos) Programar u disparador que actualice la tabla Estadísticas(Provicia, Empleados, SueldoMedio, SueldoMáximo, SueldoMíimo) cada vez que se iserte ua tupla e la tabla Empleados del problema aterior. E esta tabla se tiee ua fila por cada provicia co el úmero de empleados de esa provicia, el sueldo medio, míimo y máximo. Se cosidera que existe previamete creada ua fila e la tabla Estadísticas por cada provicia. Supógase e este problema que cada empleado sólo tiee u domicilio asociado. La defiició de la tabla Estadísticas puede ser: CREATE TABLE Estadísticas(Provicia CHAR(50) PRIMARY KEY, Empleados INTEGER, SueldoMedio NUMBER(0,2), SueldoMáximo NUMBER(6,2), SueldoMíimo NUMBER(6,2)); La actualizació de la tabla Estadísticas preseta el problema de la tabla mutate. E este caso, si el disparador se activa por cada fila, o se puede cosultar Empleados para calcular los agregados sobre sueldo, ya que esta tabla se está actualizado. Si embargo, se puede actualizar co respecto a la ueva tupla itroducida e Empleados y la iformació que existe e Estadísticas, que o está mutado. Así, al isertar u uevo empleado, se calcularía: Estadísticas.Empleados Estadísticas.Empleados+ Estadísticas.SueldoMáximomáximo(Empleados.Sueldo, Estadísticas.SueldoMáximo) Estadísticas.SueldoMíimomíimo(Empleados.Sueldo, Estadísticas.SueldoMíimo) El sueldo medio al añadir uo empleado más se puede obteer e fució del sueldo medio y el úmero de empleados ateriores. Se puede ver fácilmete que la media de elemetos es:
Facultad de Iformática Uiversidad Complutese de Madrid 4/9/2007 x +... + x x Al añadir u uevo elemeto, la media es: x +... + x + x+ x + + Esta expresió se puede reescribir e térmios de x, y x + : x x + x +... + x +... + x + x+ x +... + x x+ x+ + + + + + + + x +... + x + + x x +... + x x +... + x x + x + x x+ x + x+ x + + + + + Por lo tato: Estadísticas.SueldoMedio(Estadísticas.Empleados* Estadísticas.SueldoMedio+:NEW.Sueldo)/(Estadísticas.Empleados+) CREATE OR REPLACE TRIGGER ActualizaEstadísticas AFTER INSERT ON Empleados FOR EACH ROW BEGIN UPDATE Estadísticas SET EmpleadosEmpleados+, SueldoMedio(Empleados*SueldoMedio + :NEW.Sueldo) /(Empleados+), SueldoMáximoGREATEST(SueldoMáximo,:NEW.Sueldo), SueldoMíimoLEAST(SueldoMíimo,:NEW.Sueldo) WHERE Provicia (SELECT "Códigos postales".provicia FROM Domicilios, "Códigos postales" WHERE :NEW.DNIDomicilios.DNI AND Domicilios."Código postal""códigos postales"."código postal"); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error iesperado.'); END; / Otra opció es retrasar la actualizació de la tabla Estadísticas hasta que se haya completado la orde de iserció completamete, es decir, usar el disparador e el ivel de orde, o de fila. El problema es el redimieto, porque habría que calcular los agregados sobre toda la tabla Empleados e cada iserció y, lo que es peor, para todas las provicias. CREATE OR REPLACE TRIGGER ActualizaEstadísticas AFTER INSERT ON Empleados BEGIN DELETE FROM Estadísticas; INSERT INTO Estadísticas
Facultad de Iformática Uiversidad Complutese de Madrid 4/9/2007 SELECT Provicia,COUNT(*),AVG(Sueldo),MAX(Sueldo),MIN(Sueldo) FROM Empleados, Domicilios, "Códigos postales" WHERE Empleados.DNIDomicilios.DNI AND Domicilios."Código postal""códigos postales"."código postal" GROUP BY Provicia; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error iesperado.'); END; / 4) (3,6 putos) Se desea idexar u archivo r(a: Strig(20), B: Strig(250), C: Strig(350)), co represetació ASCII y 00.000 filas, bajo la clave A (co repeticioes) mediate ua estructura de ídice secudario deso y asigació elazada. El archivo secudario cotiee 20.000 filas. Cada cajó se implemeta e u bloque. Los bloques tiee u tamaño de ta sólo 50 bytes, sus direccioes ocupa 4 bytes y tiee mapas de bits de existecia para los registros. Se pide: a) (0,6 putos) Describir la estructura y tamaño de los ficheros de ídice, de datos y los cajoes. E media, el fichero de datos tedrá 5 etradas repetidas (00.000/20.000) por cada etrada del fichero de ídice (que es deso y represeta a todos los valores de la clave que aparece e el fichero de datos). Por lo tato, cada etrada del fichero de ídice tiee asociado u cajó co 5 etradas que aputa al fichero de datos. Fichero de ídice: Registros de pares (Valor de la clave, Direcció de bloque) Tamaño: 20.000*(20+4) 480.000 bytes Bloque: Mapa de bits de existecia (N bits), N registros y direcció de elace (4 bytes). Fichero de datos: Registros de tuplas (A, B, C) Tamaño: 00.000*(20+250+350)62.000.000 bytes Bloque: Mapa de bits de existecia (N bits), N registros y direcció de elace (4 bytes). Cajoes: Registros de direccioes de bloque Tamaño: 20.000*5*4400.000 bytes Bloque: Mapa de bits de existecia (N bits), N registros y direcció de elace (4 bytes). b) (2,0 putos) Calcular el factor de bloqueo de los ficheros de datos y de ídice y de los cajoes. Para el fichero de datos: N*(20+250+350)*8+4*8+N 50*8, dode:
Facultad de Iformática Uiversidad Complutese de Madrid 4/9/2007 N*(20+250+350)*8N*4.960 es el tamaño e bits ocupado por u registro (20 bytes para el campo A, 250 para el campo B y 350 para el campo C). 4*832 es el úmero de bits ocupado por la direcció del siguiete bloque para la asigació elazada N so los bits ecesarios para el mapa de bits de existecia 50*8400 es el úmero de bits e los 50 bytes de u bloque N*(4960+) 400-32 N 0,0742 Por tato, el factor de bloqueo N del fichero de datos es de 0,0742 registros por bloque. Calculado su iversa, se obtiee que so ecesarios 3,5 bloques para alojar u registro. Para bloques fijos (la situació más habitual), se usa 4 bloques y se desperdicia medio bloque por cada registro. Para el fichero de ídice: N*(20+4)*8+4*8+N 50*8, dode: N*(20+4)*8N*92 es el tamaño e bits ocupado por u registro (20 bytes para el campo clave A y 4 bytes para la direcció de bloque). 4*832 es el úmero de bits ocupado por la direcció del siguiete bloque para la asigació elazada N so los bits ecesarios para el mapa de bits de existecia 50*8400 es el úmero de bits e los 50 bytes de u bloque N*(92+) 400-32 N,9 Por tato, el factor de bloqueo N del fichero de ídice es de registro por bloque. Para los cajoes: N*(4)*8+4*8+N 50*8, dode: N*(4)*8N*92 es el tamaño e bits ocupado por u registro (4 bytes para la direcció de bloque). 4*832 es el úmero de bits ocupado por la direcció del siguiete bloque para la asigació elazada N so los bits ecesarios para el mapa de bits de existecia 50*8400 es el úmero de bits e los 50 bytes de u bloque N*(32+) 400-32 N,5 Por tato, el factor de bloqueo N del fichero de ídice es de registros por bloque. E media, sólo será ecesario u cajó por cada etrada del ídice, pero tambié tiee direcció de elace para cotemplar el caso e que hay más de etradas por u valor de la clave. c) (,0 putos) Calcular el tiempo medio de acceso a ua tupla e cocreto bajo su valor de la clave e dos supuestos: si usar el fichero de ídice y usádolo. Determiar la gaacia de velocidad e este último caso. Cosidérese u tiempo de lectura de bloque de 2 ms. Si usar el fichero de ídice:
Facultad de Iformática Uiversidad Complutese de Madrid 4/9/2007 E media hay que recorrer 00.000/250.000 registros del fichero de datos secuecialmete, es decir, 50.000*4 700.000 bloques. A 2ms por bloque se ivierte: 700.000*2ms8.400 s 40 m 2 horas y 20 miutos Usado el fichero de ídice: Se recorre 20.000/20.000 registros del fichero de ídice secuecialmete, es decir, 0.000 bloques. Despreciado el acceso al bloque del cajó ( bloque) y el de datos (4 bloques), a 2ms por bloque se ivierte: 0.000*2ms20 s 0 mi. Haciedo las cuetas de forma precisa: (0.000++4)*2ms20,8 s0 mi y 0,8*600,8 s 0 mi 0 s y 8 décimas Ua coclusió imediata es recoocer que el tamaño de bloque es muy pequeño y, auque se mejora el acceso co el ídice, se debería aumetar.