Sistemas de Información II Tema 8. Estructuras de datos en memoria secundaria Bibliografía: Elmasri y Navathe: “Fundamentos de Sistemas de Bases de Datos” 3ª edición, 2002 (Capítulo 6). Garcia-Molina, Ullman y Widom: “Database systems: the complete book”. Prentice-Hall (Capítulos 12 y 13). Carlos Castillo UPF – 2008 1 Índice Indexación Datos Consulta Índice Datos Respuesta 2 Indexación Índice Estructura que permite encontrar rápidamente un registro de datos Requerimientos Bajo sobrecosto (overhead) en espacio Alta velocidad de búsqueda [Opcional] Alta velocidad de inserción [Opcional] Alta velocidad de borrado 3 Índices en ficheros secuenciales 4 Fichero secuencial 10 | Juan 20 | Pedro 30 | Diego 40 | Ana Bloques 50 | María 60 | Iván Persona(idpersona int, nombre char(12)) Asumimos bloque es de tamaño 32 bytes (anormalmente pequeño) 5 Índice denso 10 20 30 40 50 60 B1R1 B1R2 B2R1 B2R2 B3R1 B3R2 Índice 10 | Juan 20 | Pedro 30 | Diego 40 | Ana 50 | María 60 | Iván Datos Todos los elementos están en el índice 6 Otro ejemplo índice denso 0 1 Datos (19 bytes) 0123456789012345678 JUANPEDRODIEGOTOMAS 0 Índice (4 ints) 4 Veloz en la recuperación de registros por número 9 ej.: recuperar registro 2 14 7 Índice disperso 10 B1R1 30 B2R1 50 B3R1 Índice 10 | Juan 20 | Pedro 30 | Diego 40 | Ana 50 | María 60 | Iván Datos Sólo algunos de los elementos están en el índice Densidad del índice = claves indexadas / claves totales 8 Índice primario Índice sobre el atributo según el cual están ordenados los elementos, con el primer elemento de cada bloque Es un índice disperso Aaron, Ed B1 Adams, John B2 ... Wright, Pam Bn Bloque 1 Aaron, Ed – Acosta, Marc Bloque 2 Adams, John – Akers, Jan ... Bloque n Wright, Pam – Zimmer, Byron 9 Cálculo costo acceso sin índice Datos Número de registros r = 30,000 registros Tamaño del bloque B = 1,024 bytes Tamaño del registro R = 100 bytes ¿Costo búsqueda binaria? Elementos por bloque = R/B ~ 10 Bloques totales = r / 10 = 3,000 bloques Costo búsqueda binaria = log2(3000) ~ 12 10 Cálculo costo acceso con índice Datos Número de registros r = 30,000 registros Tamaño del bloque B = 1,024 bytes Tamaño del registro R = 100 bytes Tamaño de la clave V = 9 bytes Tamaño del #bloque P = 6 bytes ¿Costo búsqueda binaria? Tamaño del índice: (V+P)*3,000 = 45,000 Número de bloques: 45,000/1,024 = 44 Búsqueda binaria = log2(44) ~ 6 + 1 = 7 11 Desventajas de este índice Inserción y borrado son costosos Solución: Inserción: desbordamiento de bloques Borrado: marca de “borrado” por elemento 12 Índice de agrupación Registros ordenados por un campo que no es único. Ej.: cod_aero, num_vuelo Cod_aero Bloque AAR B1 LAN B1 QAT B2 VAR B3 Bloque 1 AAR, 222 AAR, 333 LAN, 444 Bloque 2 LAN, 555 LAN, 666 QAT, 777 Bloque 3 VAR, 888 13 Índice de agrupación con bloques separados Se reserva espacio en cada bloque Cod_aero Bloque AAR 1 LAN 2 QAT 4 ... Bloque 1 AAR, 222 AAR, 333 Bloque 2 LAN, 444 # next # LAN, 555 LAN, 666Bloque 3 next 3 LAN,777 # # next #Bloque 4 QAT,888 QAT,999 # next # 14 Índice secundario Se construye sobre un campo que no es clave primaria Es un índice denso (cada registro tiene un lugar en el índice) 15 Índice secundario, sobre campo único Ej.: Pais( id_pais, nombre_pais ) Bloque 1 nombre_pais Argentina Argelia Burundí Camerún Chad ... id_bloque 3 1 3 2 2 1, Francia 2, Argelia 3, Suecia Bloque 2 4, Camerún 5, Chad 6, México Bloque 3 7, Burundí 8, Noruega 9, Argentina 16 Índice secundario, sobre campo no-único Ej.: Persona( dni, nombre, apellido ) 1 B1R1, B2R2 nombre id_indice Anna 1 Joan 2 Jordi 3 Xavier 4 2 B1R2, B3R1 3 B3R2, B2R1 Bloque 1 x, Anna, x x, Joan, x Bloque 2 x, Jordi, x x, Anna, x Bloque 3 x, Joan, x x, Jordi, x Se utiliza un nivel intermedio de indirección 17 Índices multinivel 18 B-Tree “Block-tree” [Bayer & McCreight, 1972] Árbol balanceado Típicamente (mínimo) 3 niveles Variante B+ es más popular 19 Nodo hoja (externo) 34 82 95 Al siguiente hermano Al registro 34 Al registro 82 Al registro 95 20 Nodo interno 21 52 75 x < 21 75 <=x 75 21 21 <= x < 52 52 52 <=x < 75 21 B-Tree 13 7 2 3 5 7 11 23 31 43 13 17 19 23 29 31 37 41 43 47 22 Búsqueda en B-Tree Buscar un elemento Nodo hoja: búsqueda binaria entre los punteros Nodo interno: búsqueda binaria y descender por el nodo apropiado Búsqueda de elementos dentro de un rango (WHERE x > 10 AND x < 20) 23 Reglas del B-Tree La raíz tiene 1 elemento (2 punteros) al menos Todas las hojas están al mismo nivel Existe una ocupación mínima (no sólo máxima) En nuestros ejemplos es 1 Existe una ocupación máxima (en este caso k=3) 24 Insertar 12 en B-Tree (trivial) 13 7 2 3 5 7 11 12 23 31 43 13 17 19 23 29 31 37 41 43 47 25 Insertar 40 en B-Tree 13 7 2 3 5 7 11 23 31 43 13 17 19 23 29 31 37 43 47 40 41 26 Insertar 40 en B-Tree (cont.) 13 40 7 2 3 5 7 11 23 31 13 17 19 43 23 29 31 37 43 47 40 41 27 Borrado de 7 en B-Tree 13 7 2 3 5 7 11 23 31 43 13 17 19 23 29 31 37 41 43 47 28 Borrado de 7 en B-Tree (cont.) 13 5 2 3 5 11 23 31 43 13 17 19 23 29 31 37 41 43 47 29 Borrado de 11 en B-Tree 13 5 2 3 5 11 23 31 43 13 17 19 23 29 31 37 41 43 47 30 Borrado de 11 en B-Tree (cont.) 13 5 2 3 5 23 31 43 13 17 19 23 29 31 37 41 43 47 31 Borrado de 11 en B-Tree (cont.) 13 13 2 3 5 23 31 43 13 17 19 23 29 31 37 41 43 47 32 Borrado de 11 en B-Tree (cont.) 23 13 2 3 5 31 43 13 17 19 23 29 31 37 41 43 47 33 Contenidos del B-Tree Un B-Tree de orden k (datos por nodo) y altura h, ¿cuántos elementos puede tener? 34 Hashing 35 Función de Hashing N claves en un dominio de tamaño D N << D h(.) Típicamente enteros entre 0yM Con M > N 36 Función de hashing típica int hashfunction(char *s) { int i; for( i=0; *s; s++ ) { i = 131*i + *s; } return( i % M ); } 37 Ejemplo simple http://en.wikibooks.org/wiki/Data_Structures/Hash_Tables 38 Colisión: solución con lista enlazada http://en.wikibooks.org/wiki/Data_Structures/Hash_Tables 39 Colisión: solución con linear probing http://en.wikibooks.org/wiki/Data_Structures/Hash_Tables 40 Hashing en memoria secundaria Se usa M pequeño (M < N) Cada bucket de la tabla de hashing es uno de los M bloques Se admiten k colisiones, k=registros por bloque Los bloques pueden tener punteros a bloques para desbordamiento Cuando se llena (M*k) puede ser muy lento hacer rehashing 41 Hashing extensible La función de hashing tiene x bits Se ocupa primero 1 bit => sólo 2 buckets Cuando se produce overflow, se reorganiza para ocupar 2 bits => 4 buckets La tabla de hashing crece dinámicamente duplicando su tamaño 42 Resumen Los SGBD ocultan una alta complejidad Conocer cómo se organizan cada motor de bases de datos ayuda a obtener mejor eficiencia Índices generan sobrecosto en espacio y sobrecosto en tiempo al modificar los datos => usar responsablemente 43