Tecnologías de Información

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 – 2007
1

Principios de diseño
Utilizar bloques de disco
Unidad mínima de lectura es un bloque

Evitar acceso aleatorio
Leer bloques contiguos

No siempre están presentes ambos principios

2

Registros

3

Registro (tupla, fila)
Secuencia de campos de distinto tipo Preguntas
¿Cómo se representa cada campo en disco? ¿Cómo se almacenan varios registros en bloques? ¿Qué pasa si los registros tienen distinto tamaño?

Operaciones
Búsqueda – Borrado – Actualización Inserción
4

Representación de elementos  de datos
Cada valor de un campo físicamente será una secuencia de bytes Strings (cadenas) de ancho fijo Strings de ancho variable Fechas Booleanos
Jerga informal “Ancho” normalmente se refiere a un campo “Largo” normalmente se refiere a un registro
5

Strings de tamaño fijo
Tipo en SQL
CHAR(3)

Ejemplo
Códigos de aeropuerto

Codificación, siempre 3 bytes, ni menos ni más, se usa un símbolo especial NULL (#, \000)
“CDG” “MIA” “LL” “X” C D G M I A L L # X # #
6

Strings de tamaño variable
Tipo en SQL
VARCHAR(30)

Ejemplo
Nombres de personas

Codificación 1: Largo
“Joan”
L J O A N L = log2(largo máximo) bytes representando el largo. Por eso se usa tanto VARCHAR(255)

Codificación 2: Terminar con símbolo
“Joan”
J O A N #
7

Números
Enteros
Siempre un número fijo de bytes Utilizar mínimo posible Con signo/sin signo aumenta rango

Misma representación para enums Flotantes
Representación independiente del procesador

8

Fecha y hora
Tipo en SQL
TIMESTAMP

Codificación 1: CHAR(14) YMDhms
“4 de Marzo del 2005” “10 de Enero del 1988 13:25”

20050304120000 19880110132500

Se utilizan 14 caracteres => 14 bytes

Codificación 2: Unix Time
Número de segundos transcurridos desde 1/1/1970 GMT Se utiliza 1 entero => 4 bytes 19 de Enero del 2038 a las 3:14 AM
9

Bit
Tipo en SQL
BOOLEAN, BIT

Ejemplo
Género Estado (activo/inactivo, ocupado/desocupado, etc.)
Consejo: reservar espacio para más estados siempre = usar shortint/smallint

Representación
1 byte completo
10

Registros
Esquema físico
Forma de leer el registro de disco

11

Registros de largo fijo
CREATE TABLE persona ( nombre CHAR(30), dirección CHAR(100), sexo BOOLEAN, fnacimiento TIMESTAMP );

Tamaño mínimo del registro = 30+100+1+4 = 135 bytes
12

Offsets
nombre +0 dirección +30 sexo +130 fnacimiento +131

Problema:
Campos deben comenzar en múltiplo de 4 (u 8), especialmente los numéricos Registro debe comenzar en múltiplo de 4 (u 8)
13

Offsets alineados
nombre +0 [2 bytes extra] dirección +32 sexo +132 [3 bytes extra] fnacimiento +136

Los bytes extra normalmente no son usados, pues pueden aparecerdesaparecer al modificar el orden de los campos
14

Encabezado de registro
Esquema usado (dirección)
Ej.: 2 bytes => 64k tablas distintas

Largo del registro
Ej.: 4 bytes => registros de hasta 2G

Fecha de último acceso Bloqueo
Ej.: 1 byte (RW, R, Libre)

OID
Campo extra que agregan algunas BD
15

Ejercicio 1
Registro con:
char(15), short int (2 bytes), timestamp, integer

¿Cuánto espacio ocupa?
Registros comienzan en cualquier posición Alinear a múltiplos de 4 Alinear a múltiplos de 8

16

Ejercicio 2
Registro con:
double, varchar(17),byte, timestamp

¿Cuánto espacio ocupa?
Registros comienzan en cualquier posición Alinear a múltiplos de 4 Alinear a múltiplos de 8

17

Ejercicio 3
Registro con:
double, varchar(17),byte, timestamp

Registro requiere encabezado con dos punteros de 4 bytes y un byte ¿Cuánto espacio ocupa?
Registros comienzan en cualquier posición Alinear a múltiplos de 4 Alinear a múltiplos de 8

18

Bloques de Registros
Tamaño fijo (ej.: 4Kb) Varios registros, dependiendo del tamaño Encabezado de bloque
Identificador del bloque Directorio de offsets de los registros en el bloque
Con espacio extra para crecer

Fechas de último acceso/modificación
19

Bloques ordenados
Cada bloque un conjunto de registros Si los bloques tienen algún orden:
Reservar espacio en cada bloque Bloques para overflow Dividir el bloque y encadenarlos

20

Direccionamiento de bloques
Necesitamos asignar un ID a cada bloque
Referencias entre bloques (ej.: “bloque siguiente”) Mantener tabla de bloques en caché Indexar por bloques

Opciones
ID con significado => representa una posición física del registro => “dirección física” ID correlativo => simplemente numera bloques => “dirección lógica”
21

Ejemplos de direccionamiento  físico
Hostname (4 bytes en Ipv4) Superficie Cilindro Pista Sector Bloque Pueden cambiar en el tiempo
=> tabla de direccionamiento lógico a físico
22

Registros de largo variable
Encabezado de registro contiene largos Ejemplo
persona(nombre,género,dirección,fnacimient o) Encabezado del registro
Largo del registro Offset de fnacimiento (¡no es necesario!) Offset de nombre Offset de dirección

Mejor orden:
Género – Fnacimiento – Nombre - Dirección
23

Registros de largo variable:  ideas para optimizar
Se ponen los campos de ancho fijo primero Campos que admiten NULL pueden ser tratados como un caso especial
En vez del offset, se guarda un NULL

24

Registros grandes
Ejemplo: campo de tipo TEXT Idea:
Usar varios bloques En el encabezado del bloque, se guarda un puntero al siguiente bloque En el siguiente bloque, se indica que es un bloque de continuación

25

Registros muy grandes
Ejemplo: campo de tipo BLOB
Imagen Sonido

Se recupera normalmente completo Normalmente no se buscan por contenido Almacenamiento: en espacio aparte

26

Registros muy grandes:  administración externa
Guardar una URL
Se ahorra transmitir el BLOB a través del socket usado para la BD Se ahorra cargar el BLOB en memoria

Requiere: borrado, modificación, inserción aparte Podemos hacer más: dividir el BLOB en varios discos para mejor velocidad El eterno dilema
Es más eficiente, pero es más difícil de mantener
27

Modificaciones
Inserción
Registros ordenados => cada registro va a un bloque específico

Borrado
Lista de espacios libres en el bloque Marcar registros como no usados => fragmentación Políticas de asignación: first-fit, best-fit

Actualización
Si cambia el tamaño => borrado + inserción
28

Indexación ¿Indización?

29

Índice primario
Índice
Valor de (algunas) clave(s) primaria(s) (ordenado) Puntero a bloque con esa clave primaria Bloque 1 (ordenado)
Aaron, Ed Adams, John ... Wong, James Wright, Pam 1 2 n-1 n

Aaron, Ed – Acosta, Marc Bloque 2 Adams, John – Akers, Jan Bloque n Wright, Pam – Zimmer, Byron
30

Densidad de índice
Índice denso
Todos los registros tienen 1 puntero

Índice disperso
No todos los registros tienen 1 puntero Densidad = Registros existentes / Registros indexados

Los índices primarios son dispersos Pueden combinarse índices de distinta densidad => skip lists
31

Índice de agrupación
Registros ordenados por un campo que no es único. Ej.: cod_aero, num_vuelo
Cod_aero Bloque AAR 1 LAN 1 QAT 2 VAR 3 Bloque 1 AAR, 222 AAR, 333 LAN, 444 Bloque 2 LAN, 555 LAN, 666 QAT, 777 Bloque 3 VAR, 888

32

Índice de agrupación con  bloques separados
Se reserva espacio en cada bloque
Bloque 1 AAR, 222 AAR, 333 Bloque 2 LAN, 444 # next # LAN, 555 LAN, 666 Bloque 3 Cod_aero Bloque next 3 LAN,777 AAR 1 # LAN 2 # QAT 4 next # ... Bloque 4 QAT,888 QAT,999 # next #

33

Índice secundario
Se construye sobre un campo que no es clave primaria Es un índice denso (cada registro tiene un lugar en el índice)

34

Í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

35

Índice secundario, sobre campo no­único
Ej.:
Bloque 1 Persona( dni, nombre, apellido ) x, Anna, x x, Joan, x 1 B1R1, B2R2 Bloque 2 nombre id_indice Anna 1 Joan 2 Jordi 3 Xavier 4 2 B1R2, B3R1 3 B3R2, B2R1

x, Jordi, x x, Anna, x Bloque 3 x, Joan, x x, Jordi, x

Se utiliza un nivel intermedio de indirección

36

Índice invertido
Índice para textos o documentos
Recuperación por palabra

Variante de índice secundario con clave no-única

37

Ejemplo índice invertido

38

Pre­proceso de índice invertido
Lematización
“Hay varios tipos de documentos” Haber|varios|tipo|de|documento No siempre es fácil
“cruces” (cruz o cruzar, depende del contexto)

Eliminación stopwords
Son muy frecuentes No aportan información

Índice al documento/párrafo/posición
39

Ejercicio
Documento 1
“Un caballo es más rápido que un coche”

Documento 2
“Conducía un coche blanco”

Document 3
“Dos caballos blancos”

Crear índice al documento y a la palabra
40

Algoritmo de Construcción

En memoria

Leer para ver frecuencias, obtener espacio, escribir listas de posteo Variante a disco Construir en memoria para un bloque Vaciar a disco Unir bloques

Por bloques
• • •

Compresión de listas de posteo
41

Hashing

42

Hashing en memoria  secundaria
Cada bucket de la tabla de hashing es un bloque Se admiten k colisiones, k=registros por bloque Los bloques pueden tener punteros a bloques para desbordamiento Crecer puede ser muy lento en disco (rehashing)
43

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

44

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

45

Sign up to vote on this title
UsefulNot useful