Академический Документы
Профессиональный Документы
Культура Документы
Unidad No. 2
Nivel interno (almacenamiento de la base de datos)
2.1 Introducción
Campo
Un campo (Field) es el elemento de datos básico (es la unidad mínima de información
de un registro). Un campo individual contiene un valor único, y esta caracterizado por
su longitud y por el tipo de dato. Dependiendo del diseño del archivo, los campos
pueden ser de dos tipos:
• Tamaño fijo o
• Tamaño variable.
Un campo puede contener un subcampo. Æ POR EJ.: el campo fecha se divide en los
subcampos día, mes y año.
Registro
Registro (Record) es una colección de campos relacionados que pueden tratarse como
una única unidad por un programa de aplicación. Por ejemplo: un registro de empleados
va contener campos como nombre, número de seguro social, etc.
También dependiendo del diseño, los registros pueden ser de longitud fija o de longitud
variable. Un registro va a tener una longitud variable si algunos de los campos son de
tamaños variables o si el numero de campos es variable. Cada campo tiene un nombre
de campo.
Estructura de campos
Hay muchas formas de añadir estructura a los archivos para mantener la identidad de los
campos. Los tres métodos más comunes son:
• Forzar que los campos tengan una longitud predecible.
• Comenzar cada campo con un indicador de longitud, y
• Colocar un delimitador al final de cada campo para separarlo del siguiente.
Estructuras de registros
Al igual que un campo, un registro es otra herramienta conceptual. Es decir, es otro
nivel de organización que se impone sobre los datos para preservar su significado. Los
registros no necesariamente existen en el archivo en un sentido físico, sin embargo
constituyen una noción lógica importante incluida en la estructura del archivo.
Para organizar un archivo en registros existen varios métodos entre los cuales podemos
mencionar:
• Exigir que los registros sean de longitud predecible. Esta longitud puede
medirse en términos de bytes o en términos del número de campos.
Este método es análogo al primer método para reconocer campos, la diferencia
importante es que cuando se cuenta a lo largo de un registro se eligen las
unidades de conteo ya que se pueden contar bytes o campos.
2
Ejemplo:
Registro Æ Ames | John | 123
Representación Hexadecimal Æ
Intervalo Valores Hexadecimales
0 - F 2800416D 65737C4A 6F686E7C 31323320
Mantenimiento de archivos
El mantenimiento de archivos es necesario, ya que a medida que se hacen cambios en
los mismos, el desempeño de las aplicaciones o procesos se ven afectados
considerablemente.
En general el mantenimiento de archivos se basa en modificaciones que se hacen a los
mismos para su manejo y mejor administración. Las más generales son:
• Agregar un registro.
• Actualizar un registro.
• Eliminar un registro.
Una de las consecuencias de los cambios en los archivos es la FRAGMENTACION del
almacenamiento.
• Fragmentación interna: esta ocurre cuando existe espacio desperdiciado dentro
de un registro. Por ejemplo, en un archivo de registros de longitud fija, la
fragmentación interna puede ocurrir cuando se almacenan registros de longitud
variable en entradas de tamaño fijo (falta de espacio). También puede ocurrir en
4
Estrategias de colocación
Existen tres estrategias básicas de colocación o inserción de registros de longitud
variable, la cuales son:
• PRIMER AJUSTE, esta estrategia es la más sencilla, y consiste en que si la
entrada (espacio) es lo suficientemente grande, entonces es utilizado.
• MEJOR AJUSTE, se da cuando un registro nuevo se coloca en el espacio más
pequeño que sea lo suficientemente grande para almacenarlo. Esta es una
estrategia atractiva para archivos con registros de longitud variable donde la
fragmentación es interna, pero implica más gasto o costo en el rendimiento de
una aplicación que otras estrategias de colocación.
6
Manejador de disco
Es un componente del sistema operativo. Es el componente responsable por todas las
operaciones físicas de I/O (algunas veces se le llama componente básico de servicios de
I/O). Este componente, necesita darse cuenta de las direcciones físicas del disco. El
manejador de archivos ve el disco simplemente como una colección lógica de page sets,
cada uno de éstos consiste en un conjunto de páginas de tamaño fijo. Cada page set es
identificado por un identificador único de page set. Cada page es identificada por un
7
númerode página que es único dentro del disco, distintos page sets no se traslapan (no
tienen páginas en común). El mapeo entre números de página y las direcciones de disco
físicas es conocido y administrado por el manejador de disco. La mayor ventaja de la
existencia de este componente consiste en que todo el código específico para acceder
los dispositivos de almacenamiento puede ser concentrado dentro de un único
componente del sistema, y todos los componentes de niveles superiores
(particularmente, el manejador de archivos) puede ser independiente de éstos
dispositivos de almacenamiento.
Todo el conjunto de páginas en el disco está dividido en colecciones desconectadas de
subconjuntos llamadas page sets. Uno de estos page sets, el page set de espacio libre,
sirve como un pool de páginas disponibles ,los otros page sets son considerados para
contener información. El alojamiento y liberación de pages de y hacia los page sets es
desarrollado por el manejador de disco en demanda desde el manejador de archivos.
Las operaciones soportadas por el manejador dedisco sobre los page sets incluyen las
siguientes:
• Recuperar la page “p” desde el page set “s”
• Reemplazarla página “p” dentro del page set “s”
• Agregar una nueva página al page set “s”
• Remover la página “p” del page set “s”
Manejador de archivos
El manejador de archivos utiliza las capacidades del manejador de disco para facilitar
que el usuario (el DBMS) utilice el disco como una colección de archivos almacenados
(o tablas, donde son almacenadas todas las ocurrencias de un tipo de registro en
particular). Cada page set contendrá uno o más archivos almacenados (tablas). El
DBMS debe darse cuenta de la existencia de los page sets, aunque no es responsabe de
manejarlas en detalle. En particular, el DBMS necesita conocer cuando dos archivos
almacenados (tablas) compraten el mismo page set o cuando dos registros almacenados
comparten la misma page.
Cada archivo almacenado es identificado por un nombre de archivo o por un
identificador de archivo, el cual debe ser único por lo menos dentro del page set que lo
contiene, y cada registro almacenado, es identificado por un número de registro o
identificador de registro, único por lo menos dentro del archivo que lo contiene
almacenado.
En algunos sistemas el manejador de archivos es un componente del sistema operativo,
en otros es un paquete con el DBMS.
Las operaciones soportadas por el manejador de archivos incluye las siguientes:
• Recuperar el registro almacenado “r” del archivo “f”.
• Reemplazar el registro almacenado “r” dentro del archivo “f”.
• Agregar un nuevo registro almacenado al archivo “f” y retornar el nuevo
identificador de registro “r”.
• Remover el registro almacenado “r” del archivo “f”.
• Eliminar el archivo “f”.
Clustering
La idea básica detrás del clustering es almacenar y recuperar registros que están
lógicamente relacionados (y son frecuentemente utilizados juntos) y que se encuentran
físicamente cerca en el disco. El clustering físico de datos es extremadamente
importante en el rendimiento.
8
Fig. 2.1
9
Fig. 2.2
La situación se muestra en la figura 2.2. El punto acerca de esta situación radica en lo
siguiente: Después de que el sistema ha sido ejecutado por un tiempo, no se garantiza
que las páginas que están lógicamente adyacentes también están físicamente adyacentes.
Por esta razón, la secuencia lógica de las páginas en un page set dado debe
representarse, no por la adyacencia física, sino por punteros. Cada página contendrá un
page header que viene a ser un set de información de control que incluye la dirección
física de la página que le sigue inmediatamente en la secuencia lógica – ver la figura
2.3.
Fig. 2.3
10
Fig. 3.4
Ahora, regresamos al manejador de archivos. Tal como el manejador de disco permite
que el manejador de archivos ignore los detalles del acceso físico a disco y poder ver la
mayor parte de la base de datos en términos de páginas lógicas, el manejador de
archivos permite al DBMS ignorar detalles de páginas de I/O y visualizar la base de
datos en términos de registros y archivos almacenados. Esta función del manejador de
archivos es conocida como administrador de registros almacenados (stored record
management).
Si una página puede acomodar múltiples registros almacenados (no uno como en el
ejemplo anterior) e interesa que los registros estén almacenados siguiendo el orden del
código, considere la siguiente secuencia de eventos:
11
Fig. 3.5
2. Ahora el DBMS inserta un nuevo registro de proveedor (S9). El manejador de
archivo almacena este registro en la página p (porque todavía tiene espacio
libre), inmediatamente después del registro del proveedor S5.
3. El DBMS elimina el registro almacenado para el proveedor 2 (S2). El
manejador de archivo elimina el registro S2 de la página p, y corre los registros
de pos proveedores S3, S4, S5 y S9 para llenar el espacio libre.
4. El DBMS inserta un nuevo registro de proveedor (S7). De nuevo el manejador
de archivo almacena este registro en la página p, ubica el nuevo registro
inmediatamente después del proveedor S5, corriendo el registro del proveedor
S9 hacia delante. Esta ilustración se muestra en la figura 3.6.
Fig. 3.6
12
El punto en este ejemplo es que la secuencia lógica de los registros almacenados dentro
de una página dada, puede ser representada por una secuencia física dentro de la página.
El manejador de archivos correrá registros individuales hacia a tras o adelante para
lograr este efecto, manteniendo todos los registros de datos juntos al inicio de la página
y todo el espacio libre junto al final.
Como se explicó anteriormente, los registros almacenados se identifican internamente
por un ID de registro o RId, la figura 3.7 muestra una implementación típica de un RID.
El RID para un registro almacenado r consiste de dos partes: el número de página p que
contiene el registro “r”, y el byte offset desde el pie de la página p identificando un spot
que contiene, el byte offset del registro “r” desde el inicio de la página “p”.
Fig. 3.7
INDEXACIÓN O INDIZACIÓN
CONCEPTO DE INDICE
Un índice se puede definir como una estructura de datos que contiene una función,
donde el argumento de la función es una clave y el valor de la función es un número de
registro. En otras palabras, con un índice es posible encontrar un número de registro
asociado al valor de clave dado.
Mientras que el archivo por sí mismo podría considerarse como un índice, sería un
índice muy ineficiente si empleáramos algoritmos como los que se usan en búsquedas
secuénciales para encontrar el número de registro.
Por lo tanto, un índice es normalmente una estructura separada del archivo, no sólo
lógicamente, como en un archivo secuencial indizado, sino también físicamente
separada, como cuando el índice se localiza en un archivo aparte.
Igual que hay muchas formas de estructurar archivos, hay muchas formas de estructurar
índices, empezaremos por la más elemental, un índice sencillo o simple.
13
El índice de un archivo secuencial indexado está mezclado con los datos del archivo.
Normalmente, la mayoría de los bloques son usados para los datos, pero algunos son
usados para el índice.
• Eliminar registros del archivo de datos Æ los métodos para esto los vimos en la
unidad anterior (uso de listas ligadas, uso de pilas). Por supuesto que cuando se
elimina un registro del archivo de datos también debe eliminarse el registro
correspondiente del archivo de índices. Como el índice está contenido en un
arreglo durante la ejecución del programa, la eliminación del registro de índice y
el desplazamiento de los demás registros para agrupar el espacio puede ser una
operación no muy costosa.
• Actualizar registros del archivo de datos Æ esta entra en dos categorías:
o La actualización cambia el valor del campo de llave: esta clase de
actualización puede traer consigo un reacomodo del archivo de índices,
así como del de datos. Puede implementarse un método de eliminar y
agregar, y dar al usuario del programa la impresión de que simplemente
está cambiando un registro.
o La actualización no afecta el campo de llave: aquí si se requiere
reacomodo del archivo de datos, pero no del archivo de índices. Si el
tamaño del registro no cambia, o si disminuye por la actualización, el
registro puede escribirse directamente en el espacio que tenía, pero si
aumenta por la actualización, se tendrá que encontrar una nueva entrada
para el registro.
Indices secundarios
Los índices secundarios, son índices que se aplican sobre uno o más campos de los
registros del archivo, que por su uso, se requiere poder localizar rápidamente los
registros a partir de éstos campos. Así en una biblioteca podríamos utilizar el catálogo
de la biblioteca con un Autor (llave secundaria) y un número de catálogo de tarjetas
(llave primaria).
Igual se pueden realizar:
• Adición de registros
• Eliminación de registros
• Actualización de registros
Tipos de árbol
• Árboles heterogéneos y homogéneos.
• Índices Árbol-B
Arbol binario
Un árbol de búsqueda binario es un árbol binario en el que los nodos se usan tanto para
almacenar información como para proporcionar la dirección hacia otros nodos. La
información se organiza de manera que todas las claves menores que la del nodo actual
se encuentran en el subárbol izquierdo y aquellas mayores están en el subárbol derecho.
Arbol AVL
El árbol AVL toma su nombre de quienes lo originaron, Adelson-Velskii y Landis. Un
árbol AVL es un árbol de búsqueda binario en el que los subárboles de un nodo se
mantienen aproximadamente a la misma altura (o profundidad). Transformaciones en el
árbol binario mantendrán su altura equilibrada.
Arbol B
El árbol B es una de las estructuras de datos más importantes en informática por sus
características de versatilidad y rendimiento. Es una buena elección para el
17
Arbol B* y B#
Un árbol B# es un árbol B en el que las operaciones de división e inserción se procesan
de un modo que pospone la división y como resultado posee una mayor utilización del
espacio y un rendimiento de recuperación más rápido que un árbol B. Todos los nodos
de un árbol B# son del mismo tamaño, de modo que es esencialmente un árbol B con un
algoritmo de inserción modificado.
Básicamente los B# y B* son bastante similiares, siendo la diferencia principal que el
nodo raíz en un árbol B* es mayor que los otros nodos en el árbol y puede contener
4d+1 registros
Arbol B+
Un árbol B+ es un árbol B en el que los registros de datos están contenidos en nodos
terminales, y los nodos no-terminales, que sólo contienen valores de claves, forman un
índice en los nodos de datos. Una ventaja es que es normalmente menos profundo que
un árbol B con los mismos datos, lo que significa que se necesitan menos pruebas para
un acceso directo.
18
Hashing (Hash-addressing)
Es una técnica para proveer un rápido acceso directo a un registro almacenado basado
en un valor almacenado para algún campo. El campo en cuestión es usualmente, pero
no necesariamente la llave primaria. En general, la técnica funciona de la siguiente
forma:
• Cada registro almacenado es colocado en la base de datos en una posición cuya
dirección (RID o solo el número de página) es calculada como alguna función
(la función de hash) de algún campo del registro (el campo hash, o la llave
hash). La dirección calculada es llamada la dirección de hash.
• Para almacenar inicialmente el registro, el DBMS calcula la dirección de hash
para el nuevo registro y da instrucciones al manejador de archivo para ubicar el
registro en esta posición.
• Para recuperar el registro posteriormente, se da el valor del campo de hash, el
DBMS realiza el mismo cálculo que utilizó para almacenar el registro y da
instrucciones al manejador de archivos para recuperar el registro en la posición
calculada.
Por ejemplo, suponiendo (a) que las llaves primarias de los proveedores son S100,
S200, S300, S400, S500, y (b) que cada registro de proveedor almacenado requiere una
página (page) entera para ser almacenado, y considere la siguiente función de hash:
Hash address (page number del ej.) = Residuo de divider la parte numérica de la
llave S# dentro de 13.
Este es unejemplo de una clase muy común de función de Hash llamada
“división/residuo” (normalmente se utilizan números primos para realizar la división).
Los números de página (pages) para los cinco proveedores son 9,5,1,10 y 6
respectivamente, lo cual se representa en la figura 3.8
Fig. 3.8
Como podemos observar, una diferencia notoria entre hashing y el uso de índices radica
en que un archivo almacenado puede tener cualquier número de índices, pero puede
tener a lo sumo una estructura de hash, en otras palabras, Un archivo puede tener
cualquier número de campos índices, pero un solo campo hash.
Adicionalmente, para mostrar como trabaja el hashing, el ejemplo también muestra por
qué la función de hash es necesaria. Podría teóricamente ser posible la utilización de
una función de hash de identidad – Ej. Usar el valor de una llave primaria numérica para
un registro almacenado directamente como la dirección hash. Esta técnica generalmente
es inadecuada en la práctica, porque el rango de posibles valores de llave primaria
usualmente es mucho mayor que el rango de direcciones disponibles, por esto, para
19
El ejemplo también muestra una de las desventajas del hashing: La secuencia física de
registros dentro del archivo almacenado casi con certeza no será la secuencia de la llave
primaria ni alguna otra secuencia que pudiera ser interpretada de forma lógica.
Otra desventaja del hashing en general es que en ella siempre existe la posibilidad de
colisiones – esto es, dos o más registros distintos que calculen la misma dirección hash.
Por ejemplo, si se incluyera el proveedor número S1400 al ejemplo anterior. La función
función de hash llega a ser inadecuada y requiere ser extendida con algún algoritmo que
resuelva el problema de las colisiones.
En términos del ejemplo original, una posible solución al problema de las colisiones
podría ser considerar el residuo de la división entre 13, no como la dirección de hash en
sí, sino más bien como el punto de inicio para una lectura secuencial. Entonces, al
insertar al proveedor S1400 se encontraría la página (page) 9 y se buscaría hacia delante
la primera página (page) disponible. Este método de búsqueda lineal puede ser
adecuado si múltiples registros son almacendados en cada página, lo cual es común en
la práctica, entonces, las primeras “n” colisiones de alguna dirección hash “p” serían
almacenadas en la página (page) “p”, y una búsqueda lineal completa podría ser
ejecutada dentro de esta página (page). Sin embargo, la siguiente (n+1)va colisión
tendría que ser almacenada en la siguiente página de sobrecarga y sería necesaria otra
operación I/O a disco.
Otra técnica para solucionar el problema de las colisiones, probablemente más utilizado
en sistemas reales, consiste en tratar la función de hash como la dirección de
almacenamiento no del registro de datos en sí, sino más bien como un “punto de
anclaje”. El punto de anclaje de una dirección de almacenamiento “a” es tomado como
el inicio de una cadena de punteros (una cadena de colisiones) enlazando juntos todos
los registros – o todas las páginas de registros – que colisionen en “a”. Dentro de una
cadena de colisión dada, la colisión típicamente podrá ser guardada en una secuencia del
campo hash, para simplificar búsquedas posteriores.
Hashing extendido
Otra desventaja del hashing visto anteriormente, es que de la misma forma que el
tamaño del archivo de datos se incremente el número de colisiones también tenderá a
incrementarse, y por consecuencia el tiempo promedio para acceder los datos se
incrementará directamente (porque más y más tiempo se utilizará buscando dentro de
conjuntos de colisiones). Eventualmente, llegará un momento en que será deseable
reorganizar el archivo, por ejemplo, descargando el archivo existente y recargandolo
utilizando una nueva función de hash.
El hashing extendido es una buena variación de la idea del hashing básico que alivia los
problemas anteriores. En efecto, el hashing extendido garantiza que el número de
accesos a disco necesarios para localizar un registro específico, nunca será mayor que
dos, y usualmente será un solo acceso y adicionalmente, garantiza que la reorganización
del archivo nunca será requerida.
20
Una característica importante del esquema de hashing extendido es que los valores del
campo hash deben ser únicos, lo cual significa que estos campos serán las llaves
primarias del archivo.
Fig. 3.9
22
Cadena de punteros
Para realizar acceso directo a los datos, se puede utilizar una representación de
cadena de punteros, esta representación puede llegar a ser mejor que la utilización de
índices, pero no necesariamente esto siempre se cumple. Esta representación se ilustra
en la figura 3.10. Como se puede observar, el ejemplo involucra 2 archivos de datos, el
de proveedores y el de ciudades. En la representación de cadenas de punteros de la
figura 3.10, no es un archivo índice, sino más bien es referenciado como un archivo
maestro. El archivo de proveedores es referido como un archivo detalle, en general la
estructura es un ejemplo de una estructura conocida como organización maestro detalle.
Técnicas de compresión
Las técnicas de compresión son formas para reducir la cantidad de almacenamiento
requerido para un conjunto dado de datos almacenados. Frecuentemente el resultado de
tal compresión será, no solamente el ahorro en espacio de almacenamiento, sino
también (y probablemente más importante), el ahorro en accesos a disco, ya que si la
información ocupa menos espacio, se requerirán menos operaciones a disco para
accederla. Por otra parte, operaciones extras de CPU serán necesarias para
descomprimir la información después de que ha sido recuperada.
Una técnica común de compresión consiste en reemplazar cada valor individual de los
datos por alguna representación de la diferencia entre éste y el valor que lo precede
inmediatamente, esta técnica es conocida como “compresión por diferencia”. Esta
técnica requiere que los datos sean accedidos en forma secuencial, ya que la
descompresión de un valor almacenado requiere el conocimiento del valor almacenado
inmediatamente antes. La compresión por diferencia puede aplicarse en situaciones en
que los datos normalmente se acceden en forma secuencial, como es el caso de los
índices simples. En el caso especial de los índices, los punteros pueden ser
comprimidos de mejor forma que los datos, además, si el orden lógico de los datos
impuesto por el índice es el mismo, o muy parecido, al orden físico del archivo
asociado, entonces los valores sucesivos de los punteros en el índice serán muy
similares unos de otros, y la compresión de punteros será muy eficiente y beneficiosa.
Efectivamente, los índices son grandes candidatos a utilizar técnicas de compresión.
Compresión jerárquica
Si un archivo almacenado es físicamente secuencial (en cluster) a través de valores de
algún campo F, y ocurre que para cada valor distinto de F ocurren en varios registros
consecutivos del archivo. Por ejemplo, el archivo de proveedores podría estar en cluster
por los valores del campo ciudad, en esta situación, todos los proveedores en la ciudad
de Londres estarían almacenados juntos, todos los de París, también estarían
almacenados juntos y así sucesivamente, entonces, el conjunto de todos los registros de
proveedores para una ciudad dada podrían estar comprimidos dentro de un simple
registro jerárquico, en el cual el valor de la ciudad en cuestión aparecería una sola vez,
seguido por los datos de los proveedores que pertenecen a la ciudad en mención (Ver
figura 3.11).
24
Atenas 1 XX 10
Londres 2 YY 20 5 MN 30
París 3 OP 10 4 YY 30
El ejemplo mostrado en la figura 3.11 consiste de 2 partes, una fija, que consiste
en el campo de la ciudad y una variable, que contiene el conjunto de proveedores que
pertenecen a la ciudad almacenada en la parte fija. El conjunto variable de entradas
dentro de un registro es llamado grupo de repetición (repeating group), de esta forma se
diría que el registro tipo jerárquico de la figura 3.11 consiste en el campo simple
“ciudad” y del grupo de repetición de la información del proveedor y este grupo está
formado por el campo que contiene el número de proveedor, el campo que contiene el
nombre del proveedor y el campo que contiene el estado, repetidos para cada proveedor
en la ciudad relevante.
Código de Huffman
Es una técnica para codificar caracteres, poco usada en sistemas actuales, pero
que permite comprimir datos si diferentes caracteres ocurren en los datos con diferentes
frecuencias (lo cual es una situación normal). La idea elemental es la siguiente: Una
hilera de bits para realizar la codificación es asignada para representar caracteres, de tal
forma que caracteres distintos están representados por hileras de bits de diferentes
longitudes, y los caracteres más comúnmente utilizados, son representados por las
cadenas más cortas. Además, ningún carácter está codificado de tal forma que su
código de n bits sea idéntico a los primeros n bits de algún otro carácter codificado.
Como un ejemplo simple, suponiendo que los datos a ser representados
involucran únicamente los caracteres A,B,C,D,E y suponiendo también que lafrecuencia
relativa de estos cinco caracteres es la siguiente:
C 10% 0001
B 5% 00001