Final 12/12/2023
Final 05/12/2023
1a) Falso, puede tener 1, 2 o más
1b) Verdadero, unique permite solo un valor null
2a) En principio crearía índices sobre campos que intervienen en el where para agilizar la
búsqueda.
- Índice sobre los usr_id, ya que no hay claves, el índice puede asegurar valores
únicos.
- Índice sobre user_nombre para evitar que se haga una búsqueda secuencial de toda
la tabla.
-
Sobre user_apellido no porque la condición es por LIKE y el índice no sería efectivo.
Tampoco sobre rol_tipo, porque los distintos valores que puede tener son pocos.
Pero si sería eficiente crear índices compuestos de (usuario.usr_id, user_nombre) y
(rol.usr_id, rol_tipo) ya que se consultan varias columnas y estos índices aceleran la
búsqueda de registros que cumplan con las condiciones.
2b) Bubble Sort: es uno de los métodos más simples pero también uno de los más lentos.
Consiste en hacer pasadas sobre los datos, donde en cada paso, los elementos adyacentes
son comparados e intercambiados si es necesario. No siempre hay que hacer todas las
pasadas sobre el array porque puede quedar ordenado antes de terminar todas las
pasadas. En el peor de los casos el tiempo de ejecución es de O(n²), y ocurre cuando el
array viene en orden inverso. Pero si está previamente ordenado el tiempo de ejecución es
lineal O(n).
Quick Sort: Es el algoritmo recursivo que mejor responde en la mayoría de los casos, con
un tiempo promedio de O(n logn) y O(n²) en el peor de los casos.
El algoritmo consiste en:
- Elegir un elemento como pivote,
- Dividir el conjunto en dos grupos donde el subconjunto izquierdo tiene elementos
menores o iguales, y el de la derecha los mayores que el pivote
- Recursivamente aplicar los pasos anteriores en cada grupo
- Finalmente, cuando no se puede subdividir, juntar las partes para obtener la
solución, respetando el lugar de los pivotes en cada iteración.
Heap Sort: se basa en una estructura de datos llamada montículo binario (heap). Un heap
es un árbol binario completo en el cual la clave de cada nodo debe ser mayor (o igual) a las
claves de sus hijos, si es que tiene. Esto implica que la clave más grande está en la raíz.
Este algoritmo tiene un orden de complejidad, para todos los casos, O(n logn)
El algoritmo de Heapsort consiste de dos fases:
- En la primera fase, con los elementos a ordenar se construye un heap.
- En la segunda fase, se desarma dicho heap y de esa forma se obtienen los valores
ordenados.
3a) Resuelto en Github
Devuelve la consulta ordenada por la jugada (de la primera a la última), y cada jugada es
ordenada por el jugador que ganó la mano anterior, es decir quien obtuvo la carta más alta.
Si ambos obtuvieron la misma carta, ordena por número de jugador (ante empate gana el 1)
Nota: según pruebas, esto último no se cumple, ante empate en la mano n, vuelve a mostrar
primero en la mano n+1 a quién apareció primero en la mano n. Esto puede ser porque la
última condición de orden (j1.jugador), nunca se evalúa (sólo hay 2 jugadores!)
3b) Resuelto en Github
Final 27/09/2023
1a) Falso, las funciones escalares retornan un valor y NULL también es un valor
1b) Falso, el código de mayor tamaño va a tener N-1 bits.
2a) Constraints: Los constraints son utilizados para asegurar que se cumplan distintos
tipos de restricciones y las reglas de integridad. Para garantizar la integridad de entidades
(cada fila de una tabla debe tener una única forma de identificarse) se utilizan los PK
Constraints; para garantizar la integridad referencial (asegurar la coherencia de datos entre
dos tablas) se utilizan los FK Constraints y para garantizar la integridad semántica (asegura
que los datos tengan una correcta configuración) se utilizan los Constraints DEFAULT,
UNIQUE, NOT NULL, CHECK y DATA TYPE.
Triggers: Los triggers son un mecanismo de la base de datos opcionales asociados a una
tabla que ejecutan un conjunto de sentencias SQL cuando un evento ocurre. Los eventos
pueden ser INSERTS, UPDATES o DELETES. Puede definirse el momento en que se
ejecutará el mecanismo: AFTER (luego de que el evento ocurra), BEFORE (antes del
evento), INSTEAD OF (en vez de ejecutar el evento) o FOR EACH ROW (por cada línea).
Respecto a la integridad, los triggers se pueden utilizar para implementar reglas de negocio;
logs de auditorías donde se registren cambios en las tablas; asegurar la integridad
referencial a tablas de otras DB.
2b) ETL es un proceso que hace referencia a extraer, transformar y cargar, y se utiliza para
combinar datos de distintas fuentes. Durante este proceso, los datos se toman (extraen) de
un sistema de origen, se convierten (transforman) en un formato que se puede almacenar y
se almacenan (cargan) en un data warehouse u otro sistema.
Staging área: es el área donde los datos van a parar luego de la migración de datos
(etapa 1 del proceso de datos en un DW). Los datos en esta área solo incluyen datos
referenciales y transaccionales. Además en esta stage, se realiza la depuración de datos
(estandarizar el formato de los datos y completar cualquier valor requerido por el DW) y la
conversión de datos (cambiar los datos con el formato y la estructura requeridos por el
DW).
3a) Los problemas que pueden surgir son:
- Problemas al momento de ejecutar porque dentro de la lógica del SP se está
sumando una varchar con un entero (@valor + 1).
- Al tener un nivel de aislamiento serializable e invocar al SP de forma concurrente,
pueden existir continuos bloqueos (deadlock) entre las transacciones.
3b) La consulta devuelve el segundo más chico (min(f1.clave)) y el segundo más grande
(max(f2.clave))
Explicación: Supongamos que Parámetros tuviese 3 filas con clave 1, 2 y 3
Cuando se hace el producto cartesiano quedan todas las filas de las tablas relacionadas
entre sí. Los casos donde f1.clave es más grande, es para f1.clave = 2, 3 (el uno no porque
no existe en la tabla menos que 1) y para f2.clave los casos en los que es mas chico son
f2.clave = 1, 2 (3 no porque no hay ninguno en la tabla más grande). Entonces
max(f2.clave) sería el segundo más grande y min(f1.clave) el segundo más chico. En
este ejemplo ambos resultados serían 2.
Final 01/08/2023
1a) Falso, read committed genera bloqueos compartidos
1b) Verdadero, en casos como índice de índice o índices sobre datos de tipo varchar
2a) OLTP (On Line Transaction Processing): también llamado Modelo Transaccional,
debido a que se basa en la ejecución de un conjunto de transacciones para obtener el
resultado esperado. Características de OLTP:
- Su ejecución se basa en transacciones
- Son sistemas “operativos”
- Procesan datos
- Los datos se almacenan normalizados
- Registran datos a nivel de detalle de cada transacción
- Los datos son volátiles
Las aplicaciones con OLTP están caracterizadas en que muchos usuarios crean, actualizan,
o retienen registros individuales. Entonces, las bases de datos con OLTP son optimizadas
para las actualizaciones de las transacciones
OLAP (On Line Analytical Processing): también llamado Modelo Relacional, debido a que
analiza y relaciona la información analizada. Características de OLAP:
- Su ejecución se basa en el análisis
- Son sistemas para la toma de decisiones
- Procesan información
- La información se almacena desnormalizados
- Registran información global por patrones de interés conocidos como “dimensiones”.
- La información es persistente o “no volátil”
Las aplicaciones en OLAP son usadas por analistas y gerentes que frecuentemente quieren
vistas de alto nivel de los datos, tales como las ventas de una línea de productos, por
región, etc. La base de datos OLAP es usualmente actualizada por bloques, generalmente
de múltiples fuentes, y provee poderosas aplicaciones multiusuario de poder analítico. Por
lo tanto, las bases de datos OLAP son optimizadas para el análisis.
2b) Árbol B:
- Es un tipo de árbol M-ario destinado a la creación de índices físicos para el acceso a
la información.
- Árbol balanceado
- Grado >= 2, aunque en la práctica el grado es mucho más grande
- Al ser balanceado, garantiza que la búsqueda, la inserción y la eliminación sean
todos de tiempo O(log N)
- Tiene dos tipos de nodos: nodo raíz o rama y nodo hoja. Cada nodo tiene los valores
de la clave ordenados de menor a mayor.
- En la búsqueda, la decisión es multicamino en base al número de hijos del nodo.
Árbol binario de búsqueda:
- Árbol binario de grado 2
- El tiempo de ejecución en el caso medio es de O(log N) y en el peor caso es O(N)
- El árbol se va construyendo en base a cómo ingresan los elementos: si son menores
o iguales que la raíz se ubican a la izquierda y si son mayores a la derecha.
- En la búsqueda, la decisión es binaria
3a) De acuerdo al nivel de aislamiento, puede ser que el stock de un producto quede en
negativo (por ejemplo con read uncommitted), o se pueden generar errores de interbloqueo
(por ejemplo con serializable read)
3b) Resuelto en Github
Final 25/07/2023
1a) Verdadero, restringiendo el acceso a un conjunto predeterminado de filas o columnas de
una tabla.
1b) Falso, puede ser menor o igual a N (de acuerdo a cómo recorre el árbol)
2a) Árbol B+: El acceso a datos se hace partiendo del nodo raíz y comparando la clave que
se está buscando con la clave que tiene ese nodo. Sabiendo que el puntero asociado
apunta a un nodo que contiene claves menores o iguales, se llega hasta el nodo hoja que
contiene la clave (si es que existe). Finalmente, este nodo hoja tendrá un puntero a los
datos. En el caso de una búsqueda por rangos, la ventaja de árboles B+ es que los nodos
hojas tienen punteros extra entre los hermanos que permiten saltar entre nodos, de modo
de agilizar la búsqueda por rango. El orden de complejidad es O(log N)
Hashing: el acceso a datos es directo con un orden de complejidad O(1). Esto hace que sea
considerablemente más rápido que los árboles para búsqueda de clave puntual, pero
cuestiones como buscar el mínimo, máximo, listar una tabla no son aplicables.
2b) READ UNCOMMITTED: Es el nivel menos restrictivo. Cuando se establece esta opción,
es posible leer datos no confirmados, los valores pueden cambiar y pueden aparecer y
desaparecer filas en el conjunto de datos antes del final de la transacción. No hay bloqueos
compartidos y los bloqueos exclusivos no están garantizados. Con este nivel se tiene: lecturas
sucias, lectura no repetibles y lectura fantasma
SERIALIZABLE READ: asegura que no existan lecturas sucias, lecturas no repetibles ni
lecturas fantasmas. Se establece un bloqueo de intervalo en el conjunto de datos, lo que
impide que otros usuarios actualicen o inserten filas hasta que finalice la transacción. Es el
más restrictivo de los cuatro niveles de aislamiento.
3a)
CREATE TABLE numeros (
clave INT PRIMARY KEY,
valor INT
);
INSERT INTO numeros (clave, valor) VALUES
(1, 100),
(3, 300),
(4, 400),
(6, 600),
(10, 1000);
SELECT n1.clave + 1 FROM numeros n1
LEFT JOIN numeros n2 ON n2.clave = n1.clave + 1
WHERE n2.clave IS NULL
3b)
INSERT INTO numeros (clave, valor) VALUES (
(SELECT TOP 1 n1.clave + 1 FROM numeros n1
LEFT JOIN numeros n2 ON n2.clave = n1.clave + 1
WHERE n2.clave IS NULL), null);
SELECT * FROM numeros
Si se ejecuta de forma concurrente y se tiene un nivel de aislamiento read uncommitted,
puede darse el caso que el insert falle por intentar insertar una fila con la misma clave
Final 23/05/2023
1a) Verdadero, si las hojas están en el mismo nivel y el árbol de Huffman tiene N niveles,
entonces todos los códigos van a tener N-1 bits
1b) Falso, solo puede evaluar campos en la tabla donde fue definido el check
2a) El proceso de split y fusión en un árbol B se da en la inserción y eliminación
respectivamente.
Split: Si en la inserción ocurre que cuando se llega al nodo hoja no hay espacio para insertar
entonces se produce el “split”. Este proceso divide el nodo en dos partes, respetando el orden
de menor a mayor, quedando así la mitad de los elementos más chicos en un nodo y la mitad
de los elementos más grandes en el otro.
Fusión: Ocurre cuando se elimina un elemento de un nodo y éste queda vacío. Por lo cual
dicho nodo debe eliminarse, lo que puede generar una baja potencial en todos los
antecesores al nodo.
2b) Modelo Estrella (star model): es un modelo de datos conformado por dos tipos de
tablas: los hechos y las dimensiones.
- Tabla de Hechos (Fact Table): registra medidas o métricas de un evento específico,
generalmente consisten de valores numéricos (datos asociados específicamente con
el evento), y claves foráneas que referencian a dimensiones que guardan
información descriptiva.
- Tabla de Dimensiones (Dimension Table): Las dimensiones pueden definir una
amplia variedad de características. Estas tablas generalmente tienen un bajo
número de registros, en comparación a las tablas de hechos, pero cada registro
puede tener un gran número de atributos para describir los datos del hecho.
3a) Devuelve las ocurrencias que hay de T1.id en la tabla T2
3b) Resuelto en Github. Solución con join
3c) No cambia en nada, ya que T2.t3_id es PK no hay repetición para un mismo valor de
T2.t1_id
3.2) Errores (considerando que todas las PK son del tipo char)
- No se puede hacer sum(T2.t3_id) porque el campo es tipo char y sum() solo aplica
para números
- En SQL Server, la subconsulta va a fallar porque al ordenar por T3.t3_col2, dicha
columna no está en un group by y se está usando una funciona agregada (min)
- El having siempre va después del group by, no después de order by
- Falta poner la columna T1.t1_col2 en el group by, ya que se usa una función
agregada en el select
Final 07/03/2023
1a) Verdadero, el barrido simétrico consiste en recorrer el subárbol izquierdo, raíz, subárbol
derecho por lo que va a devolver el conjunto ordenado de menor a mayor.
1b) Falso, está restringido el insert si la view tiene joins, función agregada o trigger. Y
también al tener “with check option” si no se cumple con la condición del where
2a) Si se necesita realizar búsquedas exactas, es decir, buscar un valor específico en el
índice, las tablas de hashing son más eficientes. En una tabla de hashing, el tiempo de
ejecución es constante O(1), mientras que en un árbol B la complejidad es O(log n),
haciendo que hashing sea más rápido para acceso directo. Pero en el caso de búsquedas
secuenciales o por rangos es más conveniente el Árbol B
2b) ETL es un proceso que hace referencia a extraer, transformar y cargar, y se utiliza para
combinar datos de distintas fuentes. Durante este proceso, los datos se toman (extraen) de
un sistema de origen, se convierten (transforman) en un formato que se puede almacenar y
se almacenan (cargan) en un data warehouse u otro sistema.
Modelo Estrella (star model): es un modelo de datos conformado por dos tipos de tablas:
los hechos y las dimensiones.
- Tabla de Hechos (Fact Table): registra medidas o métricas de un evento específico,
generalmente consisten de valores numéricos (datos asociados específicamente con
el evento), y claves foráneas que referencian a dimensiones que guardan
información descriptiva.
- Tabla de Dimensiones (Dimension Table): Las dimensiones pueden definir una
amplia variedad de características. Estas tablas generalmente tienen un bajo
número de registros, en comparación a las tablas de hechos, pero cada registro
puede tener un gran número de atributos para describir los datos del hecho.
3a) No hay error al ejecutar. Como mínimo devuelve 10 registros y como máximo 11 (Uno
de los where in puede traer 6 filas porque matchean 4 + 2 de la clave duplicada)
3b)
DELETE FROM Secuencias WHERE clave IN (
SELECT clave FROM Secuencias GROUP BY clave HAVING COUNT(*) > 1)
Final 28/02/2023
1a) Falso, repeatable read puede generar interbloqueos si dos transacciones intentan
actualizar
1b) Falso, es más recomendable si hay inserciones (o eliminaciones) muy frecuentes
2a) OLTP (On Line Transaction Processing): también llamado Modelo Transaccional,
debido a que se basa en la ejecución de un conjunto de transacciones para obtener el
resultado esperado. Características de OLTP:
- Su ejecución se basa en transacciones
- Son sistemas “operativos”
- Procesan datos
- Los datos se almacenan normalizados
- Registran datos a nivel de detalle de cada transacción
- Los datos son volátiles
Las aplicaciones con OLTP están caracterizadas en que muchos usuarios crean, actualizan,
o retienen registros individuales. Entonces, las bases de datos con OLTP son optimizadas
para las actualizaciones de las transacciones
OLAP (On Line Analytical Processing): también llamado Modelo Relacional, debido a que
analiza y relaciona la información analizada. Características de OLAP:
- Su ejecución se basa en el análisis
- Son sistemas para la toma de decisiones
- Procesan información
- La información se almacena desnormalizados
- Registran información global por patrones de interés también conocidos como
“dimensiones”
- La información es persistente o “no volátil”
Las aplicaciones en OLAP son usadas por analistas y gerentes que frecuentemente quieren
vistas de alto nivel de los datos, tales como las ventas de una línea de productos, por
región, etc. La base de datos OLAP es usualmente actualizada por bloques, generalmente
de múltiples fuentes, y provee poderosas aplicaciones multiusuario de poder analítico. Por
lo tanto, las bases de datos OLAP son optimizadas para el análisis.
2b) Árbol B:
- Es un tipo de árbol M-ario destinado a la creación de índices físicos para el acceso a
la información.
- Árbol balanceado
- Grado >= 2, aunque en la práctica el grado es mucho más grande
- Al ser balanceado, garantiza que la búsqueda, la inserción y la eliminación sean
todos de tiempo O(log N)
- Tiene dos tipos de nodos: nodo raíz o rama y nodo hoja. Cada nodo tiene los valores
de la clave ordenados de menor a mayor.
- En la búsqueda, la decisión es multicamino en base al número de hijos del nodo.
Árbol binario de búsqueda:
- Árbol binario de grado 2
- El tiempo de ejecución en el caso medio es de O(log N) y en el peor caso es O(N)
- El árbol se va construyendo en base a cómo ingresan los elementos: si son menores
o iguales que la raíz se ubican a la izquierda y si son mayores a la derecha.
- En la búsqueda, la decisión es binaria
3a) Respuestas correctas 2) y 3)
3b) Resuelto en Github
Final 22/02/2023
1a) Verdadero, va a generar el mismo código
1b) Falso, count(campo1) cuenta valores no nulos. Pero count(*) devuelve la cantidad de
filas que hay, no importa si hay nulls
2a) Join: se utiliza para juntar filas de dos o más tablas a partir de un atributo, o
combinación de atributos, con valores comunes. Existen 3 tipos de join:
- Inner join: es la opción predeterminada, y sólo devuelve las filas que coinciden en
las tablas involucradas en base a los atributos establecido en ON
-
Left join: muestra todas las filas de la tabla izquierda que matchea o no con la otra
tabla. Los datos de la otra tabla que no coincidan tendrán valor null
-
Right join: muestra todas las filas de la tabla derecha que matchea o no con la otra
tabla. Los datos de la otra tabla que no coincidan tendrán valor null
2b) Para representar un grafo de forma estática se cuenta con:
- Matriz de Adyacencia: Sea un grafo G = (V, A) con n vértices, la matriz de
adyacencia es aquella de dimensión nxn donde la posición MAij es el número de
aristas que unen los vértices Vi y Vj
-
Matriz de Incidencia: Sea un grafo G = (V, A) donde V representa los n vértices y A
los m arcos que componen al grafo, su matriz incidencia es la matriz de orden nxm,
donde cada MIij es 1 si Vi es incidente con Aj, en caso contrario es 0.
Y para la representación dinámica se cuenta con Listas de adyacencia:
- Las listas de adyacencia es un tipo de representación que se conforma por una lista
que representa los nodos que componen el grafo, donde cada una de los elementos,
que componen dicha lista de nodos, mantiene otra lista asociada que representa los
arcos o relaciones que salen de dicho nodo.
3a) Errores: el commit requiere de un begin transaction
Tabla final: número
NULL
2
4
6
3b) Respuesta: e, hay deadlock al hacer update en ambas transacciones
Final 22/12/2022
1a) Verdadero, hashing no soporta claves duplicadas
1b) Falso, solo puede haber UN trigger de instead of para una misma tabla y evento
2a) NOTA: De los vistos en clase no hay ninguno que sea constante. Imagino que se refiere
al algoritmo que tiene el mismo orden para todos los casos, por ejemplo Heapsort.
El único que es constante O(1) es hashing, pero no es un algoritmo de clasificación
2b) View: Una vista es una tabla virtual cuyo contenido está definido por una consulta. Los
datos de esta tabla proceden de las tablas a las que hacen referencia en la consulta.
Características:
- No aloca espacio de almacenamiento.
- No contiene datos almacenados.
- Está definida por una consulta que consulta datos de una o varias tablas.
- Su ejecución trae los datos “actualizados”. El resultado proviene de las tablas de
origen.
- Mismo rendimiento que ejecutar la consulta directamente
Snapshots: también llamados vistas materializadas, son parecidos a las vistas pero la
diferencia es que almacenan físicamente el resultado de ejecutar la consulta a la que hacen
referencia en un determinado momento. Características:
- Consumen espacio de almacenamiento en disco.
- Su ejecución contiene datos de un determinado momento (cuando se creó o se
actualizó por última vez)
- Deben ser recalculadas cuando los datos de las tablas que referencian, cambian.
- Pueden ser refrescadas en forma manual, o a intervalos de tiempo definidos.
- Mejor rendimiento que realizar la consulta directamente, ya que los datos están
cacheados.
Algunas cuestiones en común:
- Ocultar la complejidad de los datos.
- Simplificar sentencias al usuario.
- Presentar los datos desde una perspectiva diferente a la de la tabla base.
3a) Resuelto en Github
select top 1 M.PaisCampeon from MundialFutbol M where not exists
(select * from MundialFutbol where M.Anio>anio and M.PaisCampeon=PaisCampeon)
order by M.Anio desc
3b) Resuelto en Github
create trigger ej3b on MundialFutbol after insert
as
if(select count(*) from inserted where PaisCampeon = PaisSubCampeon) > 0
begin
raiserror('el pais campeon y subcampeon no pueden ser el mismo',1,1)
rollback
return
end
if(select count(*) from MundialFutbol M1,MundialFutbol M2
where abs(M1.Anio - M2.Anio) < 4 and M1.id != M2.id) > 0
begin
raiserror('la diferencia en años entre cada mundial no puede ser menor a 4',1,1)
rollback
end
Final 16/12/2022
1a) Verdadero, se basa en un árbol binario completo
1b) Falso, para ser árbol necesita cumplir con las condiciones necesarias:
- Grafo dirigido: las relaciones tienen que tener una dirección.
- Acíclico: no puede haber ciclos.
- Existe un camino único entre cada par de nodos.
- Los nodos tienen que superar en 1 la cantidad de arcos: (#V) = (#A) + 1
Por ejemplo un nodo con un bucle es un grafo de grado 2 pero no es árbol.
2a) La creación de índices con tablas de hashing puede ser más eficiente que con árboles
B por ejemplo en:
- Búsqueda exacta: si en un sistema la mayoría de las búsquedas que se realizan son
por claves específicas y no se realizan consultas por rangos de valores, entonces
hashing es más eficiente. El tiempo de ejecución es constante O(1) mientras que en
un árbol B es O(log n)
- Inserciones y eliminaciones frecuentes: Si se requiere realizar muchas inserciones y
eliminaciones de elementos en el índice, esto hace que el árbol B cambie su
estructura constantemente por lo que puede ser menos performante que las tablas
de hashing.
- En casos que no existan claves duplicadas
Ante estas situaciones, la utilización de una tabla hash va a ser más performante que un
árbol B
2b) Ventajas:
- En muchos casos permite un acceso a los datos más rápido.
- Si en consultas donde hay join intervienen campos que tienen índices, mejora la
performance
- Cuando se realizan búsquedas en tablas utilizando where, los índices agilizan los
tiempos de la consulta
- Mejor performance en el ordenamiento de filas
- Asegura el cumplimiento de contraints y reglas de negocio con PK, FK y unique
- Asegura valores únicos para las filas almacenadas
Desventajas:
- Ocupan espacio en disco (en algunos casos puede ser mayor al que ocupan los
datos)
- Tienen un costo de procesamiento a causa de su mantenimiento.
- En ciertas ocasiones la utilización de índices puede ser contraproducente. Por
ejemplo si hay muchas operaciones de insert, delete y update aumentaría el
overhead para mantener los índices actualizados
3a) Resuelto en Github
3b) Respuesta b). Resuelto en Github.
Explicación: En T1, PA se setea con repeatable read y PB read commited.
En T2, PA lee la tabla Producto filtrando por prod_codigo = 1. Como PA seteo con
repeatable read, va a poner un bloqueo compartido sobre ese registro (para poder mantener
sus propiedades, que son lectura repetible y que no existan lecturas sucias).
En T3, PB quiere leer de la tabla Producto el registro con prod_codigo=1, y lo puede hacer,
ya que solamente está haciendo lectura. Contrario sería si hiciera un delete o update. Como
PB está seteado con read commited, solo va a bloquear el registro por el lapso que realiza
la lectura, y luego lo libera.
En T4, PA modifica el registro que tiene el prod_codigo=1, y le cambia el detalle a "Proceso
A". Esto lo puede hacer, ya que no hay ningún proceso que haya bloqueado a
prod_codigo=1 (PB solo bloqueo ese registro en T3 durante la lectura del mismo, y luego de
eso, lo desbloquea).
En T5, PB quiere modificar el prod_codigo=1, pero no va a poder, ya que se encuentra
bloqueado por PA, para delete y update, por lo tanto se bloquea.
En T6, PA commitea el valor "Proceso A" y desbloquea ese registro. Luego de eso, se
desbloquea el PB y puede hacer el update del prod_codigo=1, cambiando el detalle a
"Proceso B". Finalmente PB realiza el commit, quedando como valor final
prod_detalle="Proceso B".
Final 06/12/2022
1a) Falso, no es lo mismo ya que Unique permite almacenar un valor en null y la PK
constraint no. La integridad de entidades establece que la clave que identifica de manera
unívoca una fila no puede ser nula.
1b) Falso, por ejemplo índice con hashing en búsquedas por rango es poco performante
2a) Transacción es un mecanismo que posee la BD para asegurarme que una secuencia
de instrucciones se ejecute en forma atómica en una unidad lógica de trabajo, es decir, o se
ejecutan todas juntas, o no se ejecuta ninguna. Las transacciones deben cumplir con las
propiedades ACID:
-
-
Atomicidad: la transacción debe ejecutarse en su totalidad o no debe ejecutarse en
absoluto.
Consistencia: asegura que una transacción no romperá la integridad de la base de
datos. Cualquier transacción llevará a la base de datos desde un estado válido a otro
estado válido
Aislamiento: asegura que no se afectan entre sí las transacciones que se ejecuten
de manera concurrente
Durabilidad: asegura la persistencia de una transacción, una vez que la transacción
ha finalizado no se podrá deshacer aunque el sistema falle.
Isolation level: son los niveles de aislamiento que va a tener una transacción frente otras,
al momento de acceder a recursos compartidos. Existen cuatro niveles de aislamiento:
- Read uncommitted: una transacción puede leer datos modificados que no han sido
confirmados por otra transacción. No genera lockeos por lo que aumenta la
performance en simultaneidad. Pero genera lecturas sucias, lecturas no repetibles y
lecturas fantasmas.
- Read commited: las transacciones solo van a leer datos modificados que han sido
confirmados (no hay lecturas sucias). Se genera un bloqueo compartido solo durante
la lectura, por lo que existen lecturas no repetibles y lecturas fantasmas
- Repeatable read: en este nivel el bloqueo compartido sobre el registro leído se
genera durante toda la transacción, por lo que otras transacciones se van a bloquear
al modificar el mismo registro. Entonces no existen lecturas sucias y asegura
lecturas repetidas, pero no evita lecturas fantasmas (no hay bloqueos frente a
inserts).
- Serializable read: es el nivel más restrictivo de aislamiento, y asegura que no
existan lecturas sucias, lecturas no repetibles y lecturas fantasmas.
Se realiza un bloqueo de intervalo de un rango de valores según la condición del
where, o se bloquea toda la tabla. De esta manera, se impide que otras
transacciones actualicen o inserten filas
Este nivel de bloqueo puede afectar la simultaneidad
2b) Casos de uso:
- Creación de índices con tablas de hashing. En ciertos casos puede ser más eficiente
que con arboles B, por ejemplo en búsquedas por claves específicas, cuando hay
inserciones y eliminaciones frecuentes
- Guardado de contraseña. Generalmente los sistemas guardan las contraseñas con
algún tipo de encriptado donde los algoritmos utilizan funciones hash (bcrypt)
- Firma digital, mediante funciones hash se verifica que el documento firmado no ha
sido alterado.
3a) Parecido a final 16/12/2022, ejercicio 3a). Resuelto en Github
select prod_codigo, (select top 1 stock_deposito from stock where
stock_deposito=p.cod_producto ordery by desc), sum(stock_cantidad)
from productos p join stock on prod_codigo=stock_producto
where stock_cantidad>0
group by prod_codigo
having count(prod_codigo) > ((select count(*) deposito)/2)
3b) Respuesta d). Resuelto en Github
Explicación: Ambos setean el nivel Serializable. El Proceso A hace un select y genera un
bloqueo compartido. Luego el Proceso B hace el mismo select, y como está leyendo, no se
bloquea pero genera otro bloqueo compartido (ambos bloqueos duran hasta que finalice la
transacción). Luego cuando PA realiza el update, genera un bloqueo exclusivo pero como
ya hay un bloqueo por parte de PB, entonces se bloquea. Lo mismo sucede para PB en T5.
Finalmente, ambos procesos están bloqueados (deadlock) por lo que el motor decide que
proceso matar primero. Y el detalle queda con algún valor de PA o PB
Final 09/09/2022
1a) Falso, para caracteres con poca frecuencia de aparición pueden tener más de 8 bits.
1b) Falso, si no hay filas solo indica que el conjunto consultado está vacío.
2a) Grafo: Un grafo puede definirse como G = (V, A), donde V representa a un conjunto de
puntos, llamados vértices o nodos, y A es un conjunto de relaciones entre pares de vértices,
llamadas aristas o arcos. De esta forma un grafo es un conjunto de vértices y arcos que los
relacionan.
Los grafos se utilizan para modelizar un problema específico a través de un modelo
abstracto donde los elementos que participan en el problema son los vértices y las
relaciones que pueden existir entre estos participantes son los arcos.
En base a las características de los grafos, los tipos pueden ser:
- Grafo libre: es aquel donde no hay aristas, es decir todos los vértices son aislados.
- Grafo completo: es el grafo en el cual cada vértice está conectado a todos los
vértices que componen el grafo
- Grafo regular: en este grafo, todos los vértices tienen el mismo grado
- Grafo simple: en este grafo, existe solo una arista que une a dos vértices
cualesquiera
- Grafo conexo: existe al menos un camino entre cada par de vértice
- Grafo no conexo: es cuando un grupo de vértices no está conectado al resto, es
decir no cumple la condición de conexo
Para representar un grafo existen dos formas: estática y dinámica
En la forma estática se cuenta con:
- Matriz de Adyacencia: Sea un grafo G = (V, A) con n vértices, la matriz de
adyacencia es aquella de dimensión nxn donde la posición MAij es el número de
aristas que unen los vértices Vi y Vj
- Matriz de Adyacencia: Sea un grafo G = (V, A) donde V representa los n vértices y
A los m arcos que componen al grafo, su matriz incidencia es la matriz de orden
nxm, donde cada MIij es 1 si Vi es incidente con Aj, en caso contrario es 0.
Y para la representación dinámica se cuenta con Listas de adyacencia: en esta
representación, los nodos que componen el grafo se representan con una lista, donde cada
elemento de la lista mantiene otra lista asociada que representa los arcos o relaciones que
salen de dicho nodo
2b) Isolation level: son los niveles de aislamiento que va a tener una transacción frente
otras, al momento de acceder a recursos compartidos. Existen cuatro niveles de
aislamiento:
- Read uncommitted: una transacción puede leer datos modificados que no han sido
confirmados por otra transacción. No genera lockeos por lo que aumenta la
performance en simultaneidad. Pero genera lecturas sucias, lecturas no repetibles y
lecturas fantasmas.
- Read commited: las transacciones solo van a leer datos modificados que han sido
confirmados (no hay lecturas sucias). Se genera un bloqueo compartido solo
durante la lectura, por lo que existen lecturas no repetibles y lecturas fantasmas
- Repeatable read: en este nivel el bloqueo compartido, sobre el registro leído, se
genera durante toda la transacción, por lo que otras transacciones se van a bloquear
-
al modificar el mismo registro. Entonces no existen lecturas sucias y asegura
lecturas repetidas, pero no evita lecturas fantasmas (no hay bloqueos frente a
inserts).
Serializable read: es el nivel más restrictivo de aislamiento, y asegura que no
existan lecturas sucias, lecturas no repetibles y lecturas fantasmas.
Se realiza un bloqueo de intervalo de un rango de valores según la condición del
where, o se bloquea toda la tabla. De esta manera, se impide que otras
transacciones actualicen o inserten filas. Este nivel de bloqueo puede afectar la
simultaneidad
3) Respuesta a). Resuelto en Github
Explicación: como la tabla está vacía, en el proceso 2 la consulta va a devolver NULL
(max(col1) = NULL y además NULL+1 = NULL). Por lo tanto el insert va a fallar por la
constraint NOT NULL del campo col1. Entonces, en el proceso 1, las variables a y b
siempre van a ser iguales (si no hay filas en la tabla count(*) = 0).
Incluso este resultado es independiente del nivel de aislamiento que se tenga, a lo sumo
existen bloqueos (no deadlock) del proceso 1 o 2, pero el resultado no cambia.
4) No tiene errores. La consulta devuelve los dos números más grandes.
Por ejemplo, si la tabla tuviera los número del 1 al 10: max t1 = 10 y max t2 = 9
Final XX/YY/2022 **
1a) Verdadero, si no se genera ese bloqueo exclusivo sería igual a read uncommitted
1b) Falso, no siempre son eficiente, por ejemplo en búsqueda por rangos
2a) Atomicidad: Es la propiedad de un DBMS que permite unificar un grupo de sentencias
en un bloque denominado Transacción de los que o bien se ejecutan todas o ninguna, o
sea, las transacciones son completas.
Transacción es un mecanismo que posee la BD para asegurarme que un conjunto de
instrucciones se ejecute como si fuese una sola instrucción, es decir, o se ejecutan todas
juntas, o no se ejecuta ninguna.
Las transacciones deben cumplir con las propiedades ACID:
- Atomicidad: la transacción debe ejecutarse en su totalidad o no debe ejecutarse en
absoluto.
- Consistencia: asegura que una transacción no romperá la integridad de la base de
datos. Cualquier transacción llevará a la base de datos desde un estado válido a otro
estado válido
- Aislamiento: asegura que no se afectan entre sí las transacciones que se ejecuten
de manera concurrente
- Durabilidad: asegura la persistencia de una transacción, una vez que la transacción
ha finalizado no se podrá deshacer aunque el sistema falle
Isolation level: son los niveles de aislamiento que va a tener una transacción frente otras,
al momento de acceder a recursos compartidos. Existen cuatro niveles de aislamiento:
- Read uncommitted: una transacción puede leer datos modificados que no han sido
confirmados por otra transacción. No genera lockeos por lo que aumenta la
performance en simultaneidad. Pero genera lecturas sucias, lecturas no repetibles y
lecturas fantasmas.
- Read commited: las transacciones solo van a leer datos modificados que han sido
confirmados (no hay lecturas sucias). Se genera un bloqueo compartido solo
durante la lectura, por lo que existen lecturas no repetibles y lecturas fantasmas
- Repeatable read: en este nivel el bloqueo compartido, sobre el registro leído, se
genera durante toda la transacción, por lo que otras transacciones se van a bloquear
al modificar el mismo registro. Entonces no existen lecturas sucias y asegura
lecturas repetidas, pero no evita lecturas fantasmas (no hay bloqueos frente a
inserts).
- Serializable read: es el nivel más restrictivo de aislamiento, y asegura que no
existan lecturas sucias, lecturas no repetibles y lecturas fantasmas.
Se realiza un bloqueo de intervalo de un rango de valores según la condición del
where, o se bloquea toda la tabla. De esta manera, se impide que otras
transacciones actualicen o inserten filas. Este nivel de bloqueo puede afectar la
simultaneidad
2b) Modelo relacional: este modelo fue propuesto por Edgar Codd para resolver problemas
de Consistencia, Redundancia, datos incongruentes, falta de criterios de estandarización. El
modelo está basado en el álgebra relacional.
El concepto fundamental en el que se basa el modelo relacional es que los datos se
representan de una sola manera, como una estructura tabular, conformada por filas y
columnas.
Algunos conceptos del modelo son:
- Relación: es un conjunto de tuplas, donde no es importante el orden de sus
componentes y tampoco existen tuplas repetidas
- Tuplas: son un conjunto de atributos (no vacío) de los elementos
- Atributos: son características de interés y tienen un dominio.
- Dominio: son un conjunto de valores posibles del atributo.
Reglas de integridad del modelo:
- Reglas de integridad de entidades: Ningún componente de la clave primaria de una
relación base puede aceptar nulos.
- Regla de integridad referencial: Cada valor de una clave foránea debe existir como
valor en la clave primaria de otra relación o ser nulo.
Para que un motor de BD sea relacional debe cumplir con las reglas de Codd
3a) Resuelto en Github
3b) Resuelto en Github
CREATE TRIGGER validar_precio_composicion ON composicion
AFTER INSERT, UPDATE
AS
IF EXISTS (SELECT c.comp_producto FROM inserted c
INNER JOIN Producto p_c ON c.comp_producto = p_c.prod_codigo
INNER JOIN Producto p ON c.comp_componente = p.prod_codigo
group by c.comp_producto, p_c.prod_precio, p.prod_precio
having sum(c.comp_cantidad*p.prod_precio) != p_c.prod_precio )
BEGIN
RAISERROR('Precio invalido.',1,1);
ROLLBACK TRANSACTION;
RETURN
END
Faltaria el trigger cuando se actualiza la tabla producto para que no rompa la regla
Final 02/03/2022
1.a) Falso, si es posible cambiar el nivel de aislamiento
1.b) Verdadero, el orden de complejidad de Heapsort siempre es O(nlogn) y de Bubble sort
es O(n) en el mejor caso (conjunto ordenado) y en el peor caso es O(n²)
2a) La creación de índices con tablas de hashing puede ser más eficiente que con árboles
B por ejemplo en:
- Búsqueda exacta: si en un sistema la mayoría de las búsquedas que se realizan son
por claves específicas y no se realizan consultas por rangos de valores, entonces
hashing es más eficiente. El tiempo de ejecución es constante O(1) mientras que en
un árbol B es O(log n)
- Inserciones y eliminaciones frecuentes: Si se requiere realizar muchas inserciones y
eliminaciones de elementos en el índice, esto hace que el árbol B cambie su
estructura constantemente por lo que puede ser menos performante que las tablas
de hashing.
- En casos que no existan claves duplicadas
Ante estas situaciones, la utilización de una tabla hash va a ser más performante que un
árbol B
2b) Algunos ejemplos de grafos irrestrictos:
- Modelizar la relación “Amistad” en redes sociales. Por ejemplo, si A es amigo de B y
B es amigo de C, por transitividad A es amigo de C
- Modelizar mapas como Google Maps. Mediante un grafo dirigido se puede
establecer el recorrido de un punto a otro
- Diseño de redes, ya sea de agua, electricidad, telefonía, etc. Al establecer el camino
mínimo se puede diseñar la red de manera eficiente
3a) Respuesta b)
Explicación: en T2 ambas transacciones generan un bloqueo compartido. Esto hace que en
T3 ambos procesos se bloqueen (deadlock) al hacer UPDATE por generar el bloqueo
exclusivo. Por lo tanto, el motor es quien decide que proceso matar y por tal motivo la
cantidad puede ser 100, si A muere y B finaliza, o 99 si B muere y A finaliza.
3b) Se puede producir el stock negativo porque se obtienen lecturas no repetibles en el
select de la tabla Stock (sentencia if). Read committed solo garantiza que no haya lecturas
sucias. Una mejora podría ser usar el nivel Repeatable Read en las transacciones.
El problema estaba en la sentencia IF (select cantidad FROM STOCK where id_producto =
@prod) >= @cantidad. Obtenía lecturas NO Repetibles de la tabla Stock. El código del
trigger estaba correcto, sin errores, no había que cambiarle nada, solo que cuando iba a
correr esa consulta IF y si resultaba = TRUE, a continuación recomendaban setear el nivel
de aislamiento en Repeatable Read, luego ejecutar el Update en la tabla Stock descontando
la cantidad y luego volver a setear el nivel de aislamiento en Read Commited.
Final XX/YY/2022 ****
1a) Verdadero, el barrido simétrico consiste en recorrer el subárbol izquierdo, raíz, subárbol
derecho por lo que va a devolver el conjunto ordenado de menor a mayor en un ABB.
1b) Falso, su orden de complejidad depende de n (no es constante). En el caso promedio es
O(n logn) y en el peor caso es O(n²)
2a) Si se necesita realizar búsquedas exactas, es decir, buscar un valor específico en el
índice, las tablas de hashing son más eficientes. En una tabla de hashing, el tiempo de
ejecución es constante O(1), mientras que en un árbol B la complejidad es O(log n),
haciendo que hashing sea más rápido para acceso directo. Pero en el caso de búsquedas
secuenciales o por rangos es más conveniente el Árbol B.
2b) Las propiedades ACID son:
- Atomicidad: la transacción debe ejecutarse en su totalidad o no debe ejecutarse en
absoluto.
-
-
Consistencia: asegura que una transacción no romperá la integridad de la base de
datos. Cualquier transacción llevará a la base de datos desde un estado válido a otro
estado válido
Aislamiento: asegura que no se afectan entre sí las transacciones que se ejecuten
de manera concurrente
Durabilidad: asegura la persistencia de una transacción, una vez que la transacción
ha finalizado no se podrá deshacer aunque el sistema falle
3a) Resuelto en Github
3b) Respuesta D. Resuelto en Github
Final 21/02/2018
1a) Falso, es un árbol (equilibrado) balanceado porque todos los nodos maximales se
encuentran en el mismo nivel.
1a) (otra respuesta) Verdadero, un árbol principal derecho balanceado cumple con:
- Árbol Balanceado: todas sus hojas tienen el mismo nivel.
- Árbol principal derecho: todos los nodos no principales tienen un único padre y el
nodo principal es el minimal del árbol (llamado raíz) y es único.
1b) Falso, en alta concurrencia se pueden generar bloqueos o errores por interbloqueo
(deadlock) lo cual afecta la performance. Puede ser recomendable un nivel más permisivo
como read committed o read uncommitted
2a) View: Una vista es una tabla virtual cuyo contenido está definido por una consulta. Los
datos de esta tabla proceden de las tablas a las que hacen referencia en la consulta.
Características:
- No aloca espacio de almacenamiento.
- No contiene datos almacenados.
- Está definida por una consulta que consulta datos de una o varias tablas.
Usos:
- Ocultar la complejidad de los datos.
- Simplificar sentencias al usuario.
- Presentar los datos desde una perspectiva diferente a la de la tabla base.
- Aislar a las aplicaciones de los cambios en la tabla base
La vista suministra un nivel adicional de seguridad restringiendo el acceso a un conjunto
predeterminado de filas o columnas de una tabla. Al crear la view el usuario debe tener
permiso de select sobre las columnas de las tablas involucradas.
Respecto a la integridad, WITH CHECK OPTION realiza un chequeo de integridad de los
datos a insertar o modificar, los cuales deben cumplir con las condiciones del WHERE de la
vista.
A través de las vistas, es posible limitar los datos que los usuarios pueden ver y manipular,
lo que ayuda a mantener la integridad.
Algunas vistas tienen restringidos los INSERTs, los DELETEs y los UPDATEs (si tiene joins,
función agregada o triggers).
2b) Dominio: son un conjunto de valores posibles del atributo. Por ejemplo, Edad: serían
todos los enteros positivos mayores a cero.
Integridad de entidad: es usada para asegurar que los datos pertenecientes a una misma
tabla tienen una única manera de identificarse, es decir que cada fila tenga una PK capaz
de identificar unívocamente una fila y esa clave no puede ser nula.
Integridad referencial: es usada para asegurar la coherencia entre datos de dos tablas. La
integridad referencial determina que todos los valores que toma una FK deben ser valores
que existan como clave primaria en otra tabla o ser nulo.
Integridad semántica: es la que asegura que los datos a almacenar tengan una apropiada
configuración y que respeten las restricciones definidas sobre los dominios o sobre los
atributos. Ejemplo, un campo no puede ser nulo. (default, unique, not null, check, data type).
3a) Resuelto en Github
3b) Respuesta b). Resuelto en Github
Explicación: Si bien en la consulta no se menciona a la ciudades, hay una situación que
hace que en el resultado aparezcan solamente países que tengan habitantes. Y es la
condición del WHERE, la igualdad considera provincias con habitantes por lo que sí tienen
habitantes, tienen al menos 1 ciudad. Entonces, si para algún país ninguna de sus
provincias tuviese habitantes, el max(pro2.habitantes) = NULL para ese país y se descarta
porque pro.habitantes = NULL no se cumple (para evaluar null se debe utilizar is null)
También cabe aclarar que la opción B dice "Como mínimo 1 registro por país". Esto es
porque un mismo país podría tener dos provincias con la misma cantidad de habitantes. Si
eso ocurriese, aparecería ese país dos veces en el resultado final (La opción C sería válida
si existiese un group by de país)
Final X
3b) Respuesta d)
Explicación: en T2 se crea un lockeo compartido y en T3 se crea otro más. Después en T4,
PA va a intentar hacer un lockeo exclusivo y no va a poder. Se queda esperando que el
lockeo compartido que se generó en T3 termine. Y en T5 pasa lo mismo para PB, necesita
que el lockeo compartido que generó PA termine.
Entonces se genera un deadlock. El motor decide matar a uno de los dos procesos. Por lo
cual no se sabe el valor que va a tener prod_detalle
Final XX
Zaffaroni videos
https://www.youtube.com/playlist?list=PLe5sv7dROOZ1alqLI7UHzkfEzS9DAoQ-E
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )