1.42k likes | 1.69k Views
Bases de Datos Avanzadas. Eduardo Mena D.0.17, tutorías 13:00-15:00 (M, X, J) emena@posta.unizar.es http://www.cps.unizar.es/~mena/. Bloque asignaturas BDs. Asignaturas Ficheros y BD (troncal) Diseño de BD Relacionales (opt.) BD Avanzadas (opt.) Sistemas de Información (opt.)
E N D
Bases de Datos Avanzadas Eduardo Mena D.0.17, tutorías 13:00-15:00 (M, X, J) emena@posta.unizar.es http://www.cps.unizar.es/~mena/
Bloque asignaturas BDs • Asignaturas • Ficheros y BD (troncal) • Diseño de BD Relacionales (opt.) • BD Avanzadas (opt.) • Sistemas de Información (opt.) • Interacción Hombre-Máquina (opt.) • Problemas detectados • DBDR debería ser troncal • el diseño de BDs es fundamental para un informático • proyección laboral • Interacción Hombre-Máquina poco relacionada con BDs FBD DBDR IHM BDA SI
¿Cómo enfocar el aprendizaje ? • Teoría de BD´s vs. Profundizar en un SGBD concreto • DISEÑO CONCEPTUAL --> Indpte. modelo y SGBD • DISEÑO LÓGICO --> Dpte. modelo e indpte. SGBD • DISEÑO FÍSICO --> Dpte. SGBD (+/- reglas generales) • Por supuesto: administración de BDs, etc. es dpte. SGBD • Los SGBD son caros y hay varios distintos. • Los alumnos esperan aprender ORACLE (o Access...): hay ofertas de trabajo que lo exigen. Similar a Programación en pseudocódigo vs. Lenguaje de programación concreto
Repetición / Relacióncon otras materias • Ficheros • son TADs: implementación de operaciones: funciones hash, índices (árboles B,...). Interesante estudiar la complejidad. • unidades mínimas de información en el SO. • Transacciones sobre BDs Progr. concurrente (excl. mut, sinc) • Diseño de BDs Ingeniería del Software • BDA LPOO + SO + Redes + IA + ... • SI Redes + Web + IA + ...
BDA: Objetivos • SGBD relacionales otras alternativas • Conocer las tendencias futuras (I+D) • Desarrollo de prototipos en entornos heterogéneos (y distribuidos) • Diseñar e implementar un sistema multibase de datos • Saber aplicar todos nuestros conocimientos a casos “reales”
BDA: Evaluación • 50%: Examen teórico-práctico (40%, 60%) • No hay que empollar • 50%: Práctica • Libertad de diseño • Heterogeneidad • Imaginación • Autosuficiencia • Hay que aprobar ambas pruebas
Optimización de preguntas • Optimización: pregunta plan costo ópt. costo = CPU + I/O + COMUNICACIONES • Necesario para responder eficientemente • Posible con lenguajes no procedurales (ej. SQL) • leng. no procedural: se dice qué se quiere obtener y no cómo obtenerlo (algoritmo, uso de índices...) • sistemas con lenguajes procedurales: ej. IMS (jerárquico) o CODASYL (en red)
Ejemplo motivador • La optimización es posible y necesaria • Las distintas estrategias requieren costes muy distinto • Debe ser un proceso automático • depende del momento concreto en la vida de la BD • es complicado saber qué estrategia es mejor • Nunca se esta seguro (estimaciones)
Etapas en la optimización • Convertir la pregunta en una representación interna (álgebra relacional, árbol sintáctico) • Transformar la pregunta en una forma canónica (reglas sintácticas y semánticas) • Escoger los procedimientos de bajo nivel candidatos (para cada operador) • ¿índices? ¿clustering? ¿rango y núm. valores? • Generar los planes y escoger el más barato • usar heurísticos para reducir búsqueda
Optimización sintáctica • Entrada: expresión álgebra relacional • Salida: expr. álgebra relacional equivalente • operaciones de idempotencia, propagar ctes. • operación selección se baja en el árbol • operación proyección se baja en el árbol • agrupar selecciones y proyecciones • Idea: reducir tamaño de las relaciones a combinar con la operación join
Optimización semántica • Transformar la pregunta en otra que devuelve las misma tuplas • Utilizar conocimiento semántico de la BD • restr. integridad, dependencias funcionales, claves extranjeras, reglas semánticas • En general, la opt. sem. es un proceso caro, por lo que los SGBD comerciales no la aplican. Se suele basar en técnicas de Int. Artificial.
Optimización física: Selección • Algoritmos • Búsqueda lineal • Búsqueda binaria • Empleo de índices (de distintos tipos) • Selectividad de una condición • % de la relación que satisface la condición • Ejecutar primero las selecciones de mayor selectividad
Optimización física: Join • Algoritmos • Ciclo anidado (Nested Loops) o fuerza bruta • Sort-Join (Sort Merge) • Join con índice en una de las relaciones • Join con índice para cada relación • Hash-Join
Optimización física: otras op. • Proyecciones: fácil de implementar (hay que recorrer todas las tuplas) • Producto cartesiano: muy costosa • Evitarla • Unión, Intersección, Diferencia • Primero se ordenan las dos relaciones
Generar los planes y escoger el más barato • Planes para responder a la pregunta, y su costo • Cada plan se construye combinando el conjunto de procedimientos candidatos posibles. • Calcular el costo es complicado hay que estimar tamaños de resultados intermedios (estadísticas de la BD, en el catálogo). • Calcular el orden óptimo de ejecución de joins • N! posibilidades de ejecutar un join entre N relaciones • Evitar resultados intermedios (subir selecciones) • Usar heurísticos para reducir la búsqueda
Optimización del costo:CPU + I/O + COM • BD centralizadas • generalmente se tiene en cuenta sólo costo I/O • BD distribuidas en Redes Area Amplia (WAN) • generalmente, sólo costo COM. • BD distribuidas en Redes de Area Local (LAN) • generalmente, costos I/O y COM. • BD en servidores paralelos • influyen los tres: CPU, I/O y COM.
Optimización en Oracle • Optimización basada en reglas o basada en costes (seleccionado por el usuario) • EXPLAIN PLAN: ver como se ejecutará una sentencia SQL • No hay optimización semántica • hasta Oracle 8, incluido • Se puede influir en el uso o no de índices (no recomendado)
Conclusiones • Los SGBD realizan optimización de preguntas • son inútiles algunas reformulaciones de preguntas • Algunas optimizaciones (todavía) no son realizadas por los SGBD (ej. optimización semántica) • hay que reformular algunas preguntas • El proceso de optimización de preguntas es complejo y cada SGBD lo hace distinto. • hay que consultar el manual del SGBD concreto. • Es necesario conocer cómo se procesan las preguntas para realizar el DISEÑO FÍSICO. • cuándo es útil usar índices o hash o no utilizarlos. • saber que el join es costoso --> reducir número de joins.
Diseño Físico • El diseño físico de BD forma parte importante del ciclo de vida de un sistema de BDs. • Consiste en escoger las estructuras de almacenamiento y caminos de acceso que • 1) cumplan los objetivos del sistema • 2) proporcionen un balance óptimo entre el rendimiento (tiempos de respuesta de transacciones, número de transacciones por minuto...) y el costo (espacio utilizado, reorganizaciones de datos...). • No existen metodologías para realizar el diseño físico. Es muy dependiente del SGBD concreto.
Diseño Físico: Recopilar información. • Por cada op. (preg. SQL) con la BD indicar: • Tipo: INSERT, SELECT, UPDATE, DELETE • Tablas que se van a acceder (cardinalidad) • Condiciones de selección (selectividad de cada una) • Condiciones de combinación-join (selectividad) • Atributos a ser proyectados / modificados • Frecuencia esperada de que se realice la operación. • Restricciones importantes de ejecución (si las hay) • Regla 80-20: El 80% del procesamiento se realiza por el 20% de las transacciones.
Reconsiderar algunas de las claves utilizadas • Las claves escogidas deben asegurar que no haya elementos repetidos. • A veces se asignan códigos que toman valores numéricos sucesivos: 1,2,3,... • Problema: esto puede implicar realizar consultas con varios joins. • Si es posible hay que intentar usar claves con significado siempre que aseguren la unicidad.
Desnormalización • El proceso de normalización consiste en dividir una tabla R en R1 y R2 si R=R1 R1.K=R2.K R2 • Evita redundancia y anomalías (ins./bor./mod.) • Problema: Para obtener R hay que hacer el join • Si (casi) siempre que se recuperan los valores de R1 se utilizan también los de un mismo atributo(s) R2.Atr, entonces se puede añadir el atributo R2.Atr a la tabla R1 --> (No estaría en 3FN!!) • Hay que controlar que no haya anomalías • Habrá redundancia pero estará controlada • Se evitará ejecutar joins (según las frecuencias def.)
Particionamiento horizontal • Si existe tabla R = sC1(R) U ... U sCn(R) donde • muchas operaciones con la BD son con sCi (R) • algunos atributos son inaplicables (NULL) según Ci • entonces cada sCi (R) se guarda en una tabla y se define una vista sobre R (¿diseño lógico? ¿físico?) • En general si una operación sCi (R) es muy frecuente, con Ci muy selectivo y R muy grande: almacenar sCi (R) en una tabla S • hay que controlar la redundancia / integridad (triggers) • inconveniente: inserciones en S o R (ver frecuencias) • los programas deberán usar la nueva tabla S • si después se suprime tabla S --> crear vista para S • para mantener indep. física. Esto sí es diseño físico !!
Particionamiento vertical • Si existe una tabla R (A1,...An,B1,...Bm) donde • muchas de las operaciones afectan sólo a atributos A1,...,An y muy pocas veces a atributos B1,...Bm • esas operaciones son muy frecuentes • R(..Ai,...,Bj...) es mucho más grande que R(..Ai...) • Entonces almacenar R(...Ai...) en una tabla S • controlar redundancia / integridad. Fácil si hay mecanismo de triggers. Si no, controlar la parte de las aplicaciones que insertan / modifican R. • inconveniente: las inserciones en R(...Ai...). Hay que valorar su frecuencia para ver si merece la pena.
Precomputar joins en tablas • Si existe una consulta R1 R2 ... Rn que se ejecuta frecuentemente, cuyo coste es elevado (los joins son costosos) y donde cada relación Ri no se actualiza frecuentemente entonces se puede crear una tabla donde se almacene el resultado de dicha consulta. • Habrá que controlar recomputar dicha consulta • 1) Utilizando triggers cada vez que cambie algún Ri • o bien 2) Ejecutando periódicamente algunos scripts (ej. a las noches). Se puede si no es obligatorio que la consulta devuelva los valores más actuales. • Valorar: frecuencia de cambios en Ri, tamaño del resultado, tiempo de ejecución de la consulta inicial
Organización física para tablas • Si un atributo se usa a menudo para recuperar tuplas en orden o para hacer joins entonces se define como clave primaria o como índice cluster (si no puede ser clave). ¡¡Sólo UNO!! • algunos SGBD permiten almacenar tablas juntas (en un mismo cluster). Útil para ejecutar joins (alternativa a desnormalizar) • Si hay otros atributos que se usan en condiciones de selección o en joins entonces se definen como índices. • conveniente si se seleccionan pocas tuplas ( < 15% total tuplas) y si la cardinalidad de la tabla es alta ( > 100 tuplas) • Si la tabla se actualiza con gran frecuencia hay que definir un número mínimo de índices (coste de actual.) • Si un atributo se usa frecuentemente para selecciones del tipo A=c o en joins y no para recuperar por orden de A, entonces definirlo como hash (si SGBD permite)
Conclusiones • Realizar el diseño físico inicial • Obtener información de las operaciones esperadas • Resolver operaciones con mayores restricciones (aplicando algunos de los métodos explicados) • Resolver el resto de las opers. sin perjudicar a otras • añadir índices para favorecer consultas perjudica a operaciones de inserción / borrado • Replantearse continuamente dicho diseño (Tunning) • analizar/auditar el sistema actual • tomar nuevas decisiones (añadir/borrar índices o tablas (crear vistas y triggers si es necesario)
Transacciones • Transacción: colección de operaciones que forman una única unidad lógica de trabajo en una BD • Control concurrencia • Sistemas multiusuario: ejecución intercalada • Recuperación • Para cuando una transacción falla • Vida de una transacción • Inicio • Lecturas/escrituras de elementos de la BD • Final (pueden hacer falta algunas verificaciones) • Confirmación (COMMIT) o anular (ROLLBACK)
Transacciones • Toda transacción debe cumplir el principio ACID • Atómica: se ejecuta todo (commit) o nada (rollback) • Debe garantizarlo el método de recuperación del SGBD • Consistente: pasa de un estado consistente a otro • Debe garantizarlo el programador y el SGBD (restr. int.) • aIslada: no lee resultados intermedios de otras transacciones que no han terminado • Debe garantizarlo el método de control de concurrencia y el programador (ej: usando protocolo bloqueo en 2 fases). • Duradera: si se termina con éxito (commit), los cambios en la BD son estables aunque luego falle otra • Debe garantizarlo el método de recuperación.
Recuperación • Caídas del sistema durante una transacción • Errores de ejecución: overflow, división por 0... • Errores lógicos que violan alguna regla de integridad (definida explícitamente o no) y que dejan inconsistente la BD -> programador/ABD • Problemas de concurrencia de transacciones • Fallos de lectura/escritura en disco • Problemas físicos y catástrofes: fuego, robos, sabotajes, fallos “humanos”,... --> medidas de seguridad informática en la empresa.
Recuperación • Para que el sistema se pueda recuperar ante fallos se necesita grabar cada operación con la BD en un fichero LOG (bitácora). Checkpoints. • se escribe en el fichero LOG antes que en la BD • el fichero LOG debe estar en memoria estable • Por cada operación se escribe un reg. en LOG • <comienza-transacción, numt> • <escritura, numt, id_dato, val_viejo, val_nuevo> • <lectura, numt, id_dato, valor> • <termina_transacción_con_éxito, numt> • <punto_comprobación, numt, numc>
Problemas de concurrencia • La ejecución concurrente de transacciones puede dar lugar a problemas: • Problema de la actualización perdida • Problema de leer una actualización temporal (lectura sucia) • Problema del resumen incorrecto • Problema de la lectura no repetible
Problemas de Concurrencia • Sol. trivial: cada transacción se ejecuta en exclusión mutua. ¿Cuál sería la granularidad? ¿BD? ¿Tabla? ¿Tupla? ¿Atributo? • La solución trivial no es válida: muy restrictiva • Se supone que las BDs se pensaron para que varios usuarios/aplicaciones accedieran a la vez • Hay que intercalar acciones pero que el resultado sea como en exclusión mutua
Control de concurrencia: planes serializables • Dadas las transacciones T1, T2, ... Tn, • T1 compuesto por operaciones O11,O12,..O1 m1 • T2 compuesto por operaciones O21,O22,..O2 m2 • ... Tn compuesto por operaciones On1, On2..On mn • Un plan de ejecución concurrente de las transacciones sería: • Ej: O11, O21, On1, On2, O12, O22, …, O1 m1, O2 m2, …, On mn • Una intercalación de todas las operaciones Oij donde para todo i, Oi1 se ejecuta antes que Oi2 ... antes que Oi mi • Un plan es serializable si su resultado es el mismo que el producido por alguno de los posibles planes seriales de T1, T2,...Tn • Ej:opers. de T2, opers. T1, opers. Tn, ...., opers. de T3
Serializabilidad • Aparte de ACID, queremos que las transacciones sean serializables. • Determinar si un determinado plan es serializable es un problema NP-completo. • Solución: Imponer restricciones a la libre intercalación de operaciones entre transacciones • Técnicas pesimistas: se impide realizar ciertas operaciones si son sospechosas de producir planes no serializables: BLOQUEOS (lock) y MARCAS DE TIEMPO (time-stamping) • Técnicas optimistas: no imponen restricciones pero después se comprueba si ha habido interferencias
Técnicas de bloqueo (lock) • A cada elemento de datos o gránulo X de la BD se le asocia una variable • operación lock_exclusivo(X): deja bloqueado al que lo pide si otro ya tiene cualquier lock sobre X • operación lock_compartido(X): deja bloqueado al que lo pide si otro ya tiene un lock exclusivo sobre X • operación unlock(X): libera su lock sobre X • Antes de leer X lock_compartido(X) • Antes de escribir (leer) X lock_exclusivo(X) • Si no se va a leer o escribir más unlock(X)
Protocolo deBloqueo en dos fases • Una transacción sigue el protocolo de bloqueo en dos fases si nunca hace un lock después de haber hecho algún unlock. • Fase de crecimiento: se solicitan locks • Fase de devolución: se realizan unlocks • Solamente este protocolo de bloqueo garantiza la serializabilidad de transacciones • Sin embargo, existe riesgo de deadlock !! • Prevención de deadlocks • Detección y recuperación de deadlocks
Deadlocks • Deadlock (o abrazo mortal o interbloqueo): cuando una transacción T1 está bloqueada esperando a que otra T2 libere un lock, la cual también está bloqueada esperando a que T1 libere uno de sus lock. Se puede generalizar para N transacciones. • Prevención de deadlocks • Cada transacción obtiene todos los locks al principio y si no puede entonces no obtiene ninguno. Problema de livelock(inanición de algunas transacciones que pueden no obtener todos los que necesiten) • Los elementos de la BD están ordenados de alguna manera y los lock hay que obtenerlos en dicho orden. Los programadores deben controlarlo !! • Detección y recuperación de deadlocks. • A medida que se piden y conceden los lock se construye un grafo de las transacciones que están esperando a otras. Si existe un ciclo en dicho grafo: deadlock. Hay que proceder a abortar a alguna de las transacciones. Problema de livelock si se aborta siempre a la misma!
Técnicas de marcas de tiempo (time-stamping) • Un timestamp es un identificador asignado a cada transacción TS(T). Indica la hora de comienzo de la transacción T. A cada elemento X de la BD se le asigna el timestamp de la última transacción que lo ha leído (TS_lect(X)) y escrito (TS_escr(X)) • Si una transacción T quiere escribir en X • si TS_lect(X) > TS(T) entonces abortar • si TS_escr(X) > TS(T) entonces no escribir y seguir • en otro caso escribir y TS_escr(X):=TS(T) • Una transacción T quiere leer de X • si TS_escr(X) > TS(T) entonces abortar • si TS_escr(X) <= TS(T) entonces leer de X y TS_lect(X):=máximo(TS(T),TS_lect(X)) • Garantiza serializabilidad y ausencia de deadlocks. Puede haber livelock (si se aborta siempre a la misma transacción)
Técnicas optimistas • No se realizan comprobaciones ANTES de ejecutar las operaciones (pedir locks, comprobar timestamps), sino al acabar toda la transacción (fase validación) • Durante la ejecución de la transacción se trabaja con copias • Hay tres fases en un protocolo optimista: • Fase de lectura • Fase de validación • Fase de escritura • Es bueno cuando no hay muchas interferencias entre transacciones (por eso son “optimistas”)
Recuperación en Oracle • Redo logs (cíclicos) • Archive logs (consolidación de redo logs) • Backups • Mirrors • Export: Incremental, acumulativo (colección de incrementales), total • Recuperación basada en cambios, tiempo, paso-a-paso (basado en archive logs), completa
Control de concurrencia en ORACLE (1) • Lectura consistente: garantiza que se lean los datos tal y como estaban al inicio de la transacción, sin impedir que otras transacciones los cambien. • Implícitamente con SELECT .. FROM T,R ... (lo garantiza sobre las tuplas de T,R,...) • Explícitamente con SET TRANSACTION READ ONLY; (lo garantiza sobre las tuplas de todas las tablas hasta el fin de transacción.) • Debe ser la primera instrucción de la transacción • No permitirá hacer ningún INSERT, DELETE o UPDATE en dicha transacción
Control de concurrencia en ORACLE (2) • LOCKs • Explícitamente con LOCK TABLE T IN x MODE • x indica si sobre todas/algunas tuplas de T en modo compartido/exclusivo) • Implícitamente con cada operación (según cláusula WHERE) • UPDATE, DELETE, INSERT. Se bloquean las tuplas insertadas, borradas o actualizadas (al ser una transacción no finalizada) • SELECT...FROM T FOR UPDATE OF atr. Se bloquean las tuplas seleccionadas
Control de concurrencia en ORACLE (y 3) • No hay UNLOCK explícitos en ORACLE!! • Se realiza un UNLOCK implícito de todos los LOCK con cada COMMIT o ROLLBACK (implícitos o explícitos) • Pregunta: ¿Cómo conseguir que las transacciones en ORACLE sigan el protocolo en dos fases, o lo que es lo mismo, sean serializables?
Interacción de Aplicaciones con Bases de Datos • Acceso básico. Casos Especiales • SQL embebido • Uso de un API • Tipos de API • ODBC. Drivers • Bases de datos en la Web