sábado, 31 de octubre de 2015

Arquitectura física de SQL Server

arquitectura SQL Server
Imagen tomada de www.enter.co

Intoducción

En entornos corporativos con mainframes, comunes hace unos años, el establecimiento de un sistema de base de datos era un acontecimiento en el que no se podía dejar nada a la improvisación. La inversión corporativa en bases de datos, tanto a nivel de hardware, software como de recursos de administrador de bases de datos requería que los detalles de la aplicación se conociesen perfectamente de antemano.
En la actualidad, las aplicaciones de bases de datos evolucionan rápidamente y las inercias se reducen, con la rapidez en el desarrollo e implantación que eso conlleva. Por ello, es necesario que el gestor de bases de datos se encargue  cada vez más de tareas rutinarias, presentando a los usuarios y al administrador una mayor simplicidad, al mismo tiempo que les dota de los mecanismos para poder modificar y extender las características de las aplicación de base de datos mientras ésta se halla en producción.
SQL Server es un potente gestor de bases de bases de datos que cumple estos requisitos necesarios para poder gestionar de forma sencilla bases de datos con grandes volúmenes de información.


Las estructuras físicas de almacenamiento y el modelo de datos

Los atributos de cada una de las entidades van a tener que plasmarse en tablas, y estas concretarse en registros. Cada uno de los registros de una tabla está limitado en la práctica como veremos, por el tamaño de la página.

Las estructuras de almacenamiento y la escalabilidad

Una importante funcionalidad que resulta deseable es la manera en que almacenan las bases de datos permita que la cantidad de información pueda crecer a medida que lo requieran las necesidades de la empresa. Además, también es importante que  puedan gestionarse con similar eficiencia volúmenes de información heterogéneos, de manera que el gestor pueda ser adecuado para bases de datos desde unos pocos Megabytes hasta los Terabytes y más allá. SQL Server almacena las bases de datos directamente en ficheros del sistema de archivos del sistema operativo del servidor. Esto permite una gran escalabilidad, ya que basta con añadir nuevos ficheros a la base de datos para hacerla crecer, aun cuando los dispositivos de almacenamiento se llenen, simplemente ubicándolos en nuevos dispositivos.

Las estructuras de almacenamiento y la obtención de datos

El modelo relacional no especifica en absoluto cómo deben almacenarse los datos, pero, el modo en el que esto se lleve a cabo repercutirá en la dinámica de las operaciones que sobre ellos se efectúen. De este modo, los datos en las tablas se organizan apoyándose en la existencia de índices, tablas de punteros a localizadores de páginas, que se almacenan en páginas de un tipo especial. La elección de una cierta arquitectura de índices repercutirá en la velocidad de ejecución de las consultas así como en la de inserción modificación o eliminación de registros.

Cómo se almacenan los datos

El almacenamiento físico de los datos en SQL Server es absolutamente independiente del almacenamiento lógico, por lo que siempre utilizaremos en nuestra operación con el gestor la terminología de  bases de datos y tablas que tan común es en el modelo relacional. Sin embargo, no resulta del todo posible, como administradores, obviar el conocimiento de las particularidades de SQL Server en cuanto al almacenamiento físico de los datos. Algunos aspectos de este almacenamiento físico pueden ser susceptibles de ser administrados, para mejorar el rendimiento del servidor. 

Estructuras de datos

SQL Server almacena los datos utilizando básicamente dos estructuras: páginas (pages) y extensiones (extents).

Páginas (pages)

Toda la información en SQL Server se almacena en páginas. Los datos y los índices o la información del catálogo, se almacenan en páginas de 8 KB, por lo que se dispone de 128 páginas por MB. El tamaño de la página es importante, pues ciertos aspectos se ven afectados por este tamaño de página como, el tamaño máximo del registro. A cada página se le asigna un identificador numérico único que permite referenciarla. Cada página contiene una cabecera de 96 bytes que contiene información crucial para la gestión de datos y a la que el servidor va a hacer referencia constantemente. La cabecera contiene el tipo de página en cuestión, además indica el espacio libre de almacenamiento disponible en esta, y también contiene punteros a las páginas anterior y posterior en el almacenamiento, así como la ubicación física de la página y el identificador del objeto al que pertenece  la página.

Extensiones (extents)

Las páginas contiguas se agrupan de ocho en ocho en extensiones. La extensión es la unidad mínima de almacenamiento en las bases de datos, por lo que es precisamente la que se asocia a una tabla o índice. Existen dos tipos de extensiones: aquellos que se asignan completamente a un objeto, es decir, en los que todas sus páginas pertenecen al mismo objeto, y los que contienen páginas de más de un objeto. Los primeros son denominados uniformes (uniform extents) y los segundos mixtos (mixed extents). Una extensión contiene 8 páginas, es decir, 64 KBytes. Sólo tablas o índices que excedan este tamaño tiene sentido que reciban extensiones uniformes. Cuando se crea un nuevo objeto se le asigna espacio en una  extensión mixta, hasta que tiene páginas de datos, momento en el que se le comienza a tratar como un objeto al que se le asignan extensiones uniformes. Este comportamiento se ilustra en  la Figura 1.
SQL server extensiones
Figura 1

Tipos de página y modos de almacenamiento


Páginas de datos (data pages)


En estas páginas es en las que realmente se almacenan los registros de cada uno de los objetos de la base de datos. El tamaño de fila está directamente limitado a esta cantidad, con la salvedad, que comentaremos con más detalle más adelante, que los tipos de datos text, ntext e image que no deben tenerse en cuenta al almacenarse en páginas separadas. Una fila no puede almacenarse en más de una página, con lo que, teniendo en cuenta que poseen una cabecera de 96 bytes y que la estructura de la fila también consume un pequeño espacio que debe almacenarse, limita el tamaño de los registros en SQL Server a 8.060 bytes. Las páginas de datos se vinculan unas con otras siguiendo un modelo de lista doblemente enlazada, de manera que cada una de las páginas contiene en su cabecera punteros a la página que le sigue y a la que le precede en la estructura de almacenamiento de un determinado objeto. Cada fila posee un número que la identifica y la información de los datos que almacena. En la parte final de la página se almacena un tabla de punteros, tal y como se Ilustra en la Figura 2, que permite acceder a las filas de datos almacenadas en el interior de la página. Esta tabla contiene la posición relativa, en bytes y respecto al origen de la página del inicio de cada uno de los registros.

SQL Server almacenamiento

Páginas de texto e imagen (text, ntext e image pages)

Este tipo de objeto que permite una gran cantidad de información almacenada se llama BLO ( Binary Large Object) o BLOPS en plural.
Para poder almacenar este tipo de objetos, SQL Server destina páginas separadas especiales que se encuentran vinculadas a las páginas  que contienen las filas de la tabla.
El tipo de datos text es el que se utiliza para almacenar cadenas de más de 8.000 caracteres. O si una fila debe almacenar varios campos que en total ocupen más de 8.000 caracteres.
El tipo ntext es similar a este pero para caracteres Unicode  cuando la cadena excede los 4.000 caracteres.
El tipo image se utiliza para almacenar imágenes, gráficos o bien cualquier tipo de fichero que contenga información no textual como  archivos ejecutables.
Cada dato que pertenezca a uno de estos tipos de datos independiente de lo grande que sea, se almacena en una fila ocupando 16 bits en realidad sólo se almacena el puntero que apunta a la ubicación real de los datos que se  encuentran en las páginas anteriormente citadas.
Las páginas de este tipo de datos pueden contener datos de más de una columna de la misma tabla pero no de tablas distintas. Incluso es posible que una misma página mezcle información de los tres tipos distintos text, ntext e image siempre que pertenezcan a la misma tabla.

Cómo se almacenan los datos en las páginas textuales

Cualquiera de los tres tipos de datos contiene una información binaria que se dividirá en páginas de 8K que se almacenan separadamente a las de datos de la misma Tabla.

Las páginas se estructuran de manera  análoga a como lo hace las páginas del índice, en un árbol balanceado (b-tree). Esta estructura en árbol sobre los fragmentos de la página facilita lecturas y búsquedas más eficientes. Además objetos text pequeños comparten páginas, con lo que se consigue un mejor aprovechamiento del espacio.

El puntero de 16 bytes que, para cada dato text se almacena en la fila de datos de la tabla, contiene un puntero a un bloque de 84 bytes que se constituye en la raíz del árbol balanceado de las páginas textuales para ese dato. En función del número de páginas necesarias para almacenar el dato, esto es, del tamaño del mismo, se insertarán tantos niveles intermedios entre la raíz y las hojas en el árbol balanceado como sea necesario.

Páginas de índice


En estas páginas se almacenan las tablas de punteros que plasman la estructura de árbol balanceado de los índices en SQL Server.

Páginas de log


El Iog es un conjunto de ficheros lógicos que contiene filas de log en páginas especiales, que en la terminología del gestor se llaman registros.

Al no construir el log con páginas de datos convencionales, no compite con los datos por la ocupación de la memoria caché, con la consiguiente mejora de rendimiento.

El log es divisible en varios ficheros físicos, puede crecer automáticamente y permite su truncado más rápido e independiente de los datos.

Páginas de asignación de extensiones (Extents)


Para conocer la distribución de los datos en las extensiones disponibles, SQL Server utiliza unas páginas especiales que se agrupan con el nombre de mapa global de asignación de extensiones  o Global Allocation Map. (GAM). Este mapa contiene información acerca de las extensiones que están ocupadas o libres. También recoge la distribución de los mixed y uniform extents, ambas informaciones se encuentran separadas en dos mapas diferentes: El GAM que almacena la información que ocupan las extensiones y un segundo mapa denominado Second Global Allocation Map, SGAM, que contiene las extensiones mezcladas  mixed extent a las que aún no  se les ha asignado ningún objeto.

Las páginas GAM tienen una estructura similar  aun Bitmap en la que cada bit está asociado a un estent gestionable. Cada página GAM puede administrar hasta 63,904 extensiones o cerca de 4GB de datos. Estas páginas contienen 1 bit por cada extension que administran. El bit toma valor 0 si la extensión a sido asignada y 1 si se encuentra libre.

La estructura de las páginas SGAM es prácticamente idéntica. También tienen un tamaño de 64K y estructura de bitmap. En este caso el bit toma valor 1 si la extension asociada es de tipo mixed extent y 0 en caso contrario aunque la extensión esté libre.

Páginas  de asignación de páginas (Page Free space, PFS)

SQL incluye un último tipo de páginas denominadas Page Free Space  (PFS), que contiene información sobre de si cada una de las páginas de datos ha sido asignada a un objeto o está libre. Es decir, las páginas GAM y SGAM sólo proporcionan información sobre si una extensión está libre o no, pero si su ocupación es parcial no indican que páginas están libres ni cual es su grado de ocupación de las que contienen datos.
Las páginas PFS tienen una estructura similar a las GAM, disponen de un array de 8.060 posiciones en que cada elemento es un bitmap de 3 posiciones y su valor representa el grado de ocupación de la página. Cada PFS controla 8.060 páginas de datos, es decir 64 Mb. La utilización combinada de las páginas GAM y PFS permite a SQL Server decidir dónde ubicar cada nuevo registro que deba añadirse a una tabla.

Páginas de ubicación de objetos (Index Allocatíon Map Pages IAM)

Todavía falta información para poder gestionar el almacenamiento en una base de datos. Sabemos qué extensiones están libres y ocupadas. Incluso conocemos el grado de ocupación de las páginas individuales, pero nos falta saber a qué objeto está asociada cada página.  
Para cada fichero de datos en el que el objeto está ubicado, se dispone de una o varias de estas páginas, en las que se almacenan las extensiones que dicho objeto tiene asignadas en ese fichero. Se almacenarán tantas páginas IAM como sean necesarias para conocer las asignaciones de extensión para todos los objetos.

Cómo decide SQL Server dónde almacenar los datos

Cuando enviamos a SQL Server una sentencia SQL, ya sea una sentencia de selección SELECT o una sentencia de modificación de datos como UPDATE o INSERT, el gestor debe decidir dónde se  hallan los datos que estamos reclamando, o dónde ubicar los registros que deseamos insertar. Estas tareas necesitan leer o modificar la información anotada en las páginas PFS, GAM e IAM anteriormente descritas.

Cómo se distribuyen las páginas de ubicación


Las páginas de ubicación se almacenan en los ficheros asociados a las bases de datos. Estos ficheros contienen una cabecera y un conjunto de bytes estructurados como una sucesión de páginas, cada una de ellas con un identificador numérico único. La primera página de cada fichero, identificada con el número 1 es una PFS, que contendrá el espacio libre en las 8.060 páginas ordinarias de datos siguientes. El fichero contendrá tantos grupos de 8.60 páginas precedidas por una PFS corno sea necesario. Tras la primera PFS, y con identificador de página 2, aparece una página GAM, y después una SGAM, con el número 3 que contiene la información de ocupación de las 64.000 primeras extensiones  que pueda contener el fichero. Esta estructura se repite por cada 64.000 extensiones que contenga el fichero.  Por el contrario la ubicación de las páginas IAM no está fijada previamente. Se insertan aleatoriamente a lo largo del fichero,  en una lista enlazada, y existirán tantas como sean necesarias para cada

Insercción de  registros


Para insertar nuevos datos en la base de datos SQL Server examinará las páginas IAM para determinar que extensiones han sido asociadas al objeto en el que estamos insertando  el registro.  Por cada una de estos extensiones el gestor inspeccionará las páginas PFS  correspondientes para determinar si existen páginas en él con suficiente espacio para añadir la nueva fila.

Si se da el caso que ninguna de las páginas ubicadas en las extensiones asociadas tenga espacio libre para insertar la fila, se asigna una nueva  extensión al objeto. Para optimizar el almacenamiento, la extensión se escoge de las que aun queden disponibles en los ficheros que más espacio vacío tengan en el grupo de ficheros. En caso de que tengan que  asociarse múltiples elementos, se hará de manera proporcional al espacio vacío disponible en cada fichero.

Páginas incompletas


Existe la posibilidad de que se produzcan escrituras incompletas de páginas de datos si por ejemplo se produce una caída de corriente eléctrica, o en casos graves de avería que detengan el servidor antes de que haya completado  una operación de entrada-salida.

Para proteger nuestra base de datos de estos fallos, podemos activar la detección de páginas incompletas (torn page detection), Si activamos esta opción, cada vez que se realiza una nueva escritura de datos en la base de datos se escriben bits adicionales de comprobación, de manera que el gestor pueda examinar el contenido de las páginas para comprobar que no se ha producido una escritura  incompleta de página.

Unidades de almacenamiento (allocaton units)


Las extensiones también se agrupan, para formar allocation units, Cada allocation unit contiene 32 extensiones, es decir, 256 páginas con un espacio de almacenamiento de 512 KB.  La primera de las 256 páginas es denominada allocation page y contiene información que permite controlar la ubicación de cada una de las páginas en la unidad de almacenamiento, así como los vínculos de cada extensión con  los objetos de la base de datos. Después de la cabecera se almacenan 32 estructuras de 16 bytes cada una, una para cada extensión en la allocation unit.

Aquí la segunda parte de Arquitectura física de SQL Server



1 comentario: