Cátedra: Ale (catedra unica)
Fecha: 5° Oportunidad - (2° Cuatrimestre) 2008
Día: 25/02/2009
Dadas las siguientes consultas en SQL:
Q1. SELECT A FROM R r1 WHERE EXISTS (SELECT * FROM R WHERE A=r1.B)
Q2. SELECT A FROM R WHERE B=ANY (SELECT A FROM R)
Elija y justifique una opción:
Dado el siguiente esquema R(A,B,C,D):
Elija y justifique una opción:
En un momento dado se toma una imagen de la base de datos (persistida en disco) y se observa lo siguiente:
Atributo | Valor |
---|---|
A | 13 |
B | 40 |
C | 35 |
D | 4 |
E | 18 |
En ese mismo instante se examina el Log y se ve lo siguiente:
Caso a)
(T1,START;);(T1,C;35);(T1,D;450);(T2,START;);(T2,C;18);(T2,B;40);(T1,COMMIT;); (START CHECKPOINT, (T2) ;);(END CHECKPOINT,;);(T2,D;18);(T3,START;);(T3,C;35); (T3,E;18);(T2,A;13);(T3,COMMIT;);(T2,COMMIT;);
Caso B)
(T1,START;);(T1,D;4);(T2,START;);(T2,E;6);(T1,A;5);(START CHKPNT, (T1,T2) ;); (T1,E;18);(T3,START;);(T3,C;35);(T3,A;13);(T2,COMMIT;);(T3,B;40);(T3,COMMIT;); (END CHKPNT,;);(T1,A;18);(T1,COMMIT;);
Lo que se pide es indicar y justificar para cada caso si: El log fue generado con UNDO, o REDO, u otro.
Q1 y Q2 retornan exactamente el mismo resultado.
Q1 retorna la columna A de todas las tuplas de R para las que existe alguna tupla que tenga en A, lo que esta tiene en B.
Q2 retorna la columna A de todas las tuplas de R para las que su valor de B pertenece a la columna A de otra tupla.
Por ejemplo, si tengo una tabla llamada Correlativas:
cod_mat | Nombre | Correlativa |
---|---|---|
61.03 | AM2 | |
62.03 | F2 | 61.03 |
62.01 | F1 | |
62.03 | F2 | 62.01 |
61.08 | A2 | |
61.10 | AM3 | 61.08 |
61.10 | AM3 | 61.03 |
75.40 | AyP1 | |
75.41 | AyP2 | 75.40 |
75.07 | AyP3 | 75.41 |
Estas Querys pasarían a ser:
Q1. SELECT cod_mat FROM Correlativas c1 WHERE EXISTS (SELECT * FROM Correlativas c2 WHERE c2.cod_mat = c1.correlativa)
Q2. SELECT cod_mat FROM Correlativas c1 WHERE c1.correlativa=ANY (SELECT cod_mat FROM Correlativas)
Por lo que ahora significa que traiga todas las materias que tienen alguna correlativa válida, por lo que la respuesta sería:
cod_mat |
---|
62.03 |
62.03 |
61.10 |
61.10 |
75.41 |
75.07 |
a) NO es UNDO porque no hay commit de T2 dentro del CKPT, y tampoco es REDO porque los cambios de T1 no estan reflejados en la BD habiendo terminado bien.
b) NO es UNDO porque no hay commit de T1 dentro del CKPT. Puede ser REDO porque no hay ninguna transacción que haya hecho commit antes de <START CKPT>, por ende no hay cambios en la BD