Dashboard

SQL SERVER INTERNALS

Capítulo

08

Ingeniería de Datos Profunda

La "Caja Negra"
al Descubierto

SQL Server no es mágico. Es un software complejo que obedece las leyes de la física (latencia de disco) y de la computación (páginas de memoria).

Entender qué pasa cuando presionas F5 es lo que separa a un usuario de SQL de un Ingeniero de Datos Senior.

1. La Unidad Atómica: La Página

Size: 8192 Bytes (8KB)

Olvida el concepto de "fila" por un momento. El motor de almacenamiento no lee filas, lee Páginas. Es el bloque más pequeño de I/O.

Anatomía Interna

  • Header
    96 Bytes Fijos Contiene metadatos críticos: `PageID`, `ObjectId` (a qué tabla pertenece), y punteros `PrevPage` / `NextPage` (lista doblemente enlazada).
  • Body
    8060 Bytes (Max) Aquí viven tus datos. Las filas se apilan una tras otra. Si una fila no cabe en el espacio restante, se mueve a una página nueva.
  • Tail
    Slot Array (Variable) Crece desde el final de la página hacia arriba. Es un índice inverso: el Slot 0 apunta al byte donde empieza la Fila 0.

El Enemigo: Page Splits

Si intentas insertar una fila en una página llena (ej: insertando un ID=5 entre el 4 y el 6), SQL Server debe romper la página en dos, mover la mitad de los datos y actualizar punteros.
Consecuencia: I/O Masivo + Fragmentación Lógica (Páginas al 50% de uso).

0x0000 HEADER (96 Bytes) PageID: 1:154
Espacio Libre (Contiguo)
SLOT ARRAY (Grow Upwards)

Diagrama interactivo: Pasa el mouse sobre las filas verdes

2. Extents y Archivos Físicos

Allocation Unit: 64KB

Las páginas no flotan en el vacío. Se agrupan en Extents (8 páginas = 64KB) para optimizar la lectura secuencial (Read-Ahead).

Primary (.mdf)

Metadata & Data

El cerebro. Contiene el catálogo del sistema y (usualmente) los datos de usuario si no hay NDFs.

Secondary (.ndf)

Partitioning

Archivos opcionales para distribuir datos en diferentes discos físicos (Filegroups).

Log (.ldf)

Write-Ahead Log

Circular. Registra CADA transacción antes de que toque los datos. Vital para recuperación (ACID).

3. Buffer Pool: La Sala de Espera

RAM Speed vs Disk Latency

Lifecycle de una Consulta SELECT

graph LR User((Usuario)) -->|SELECT *| Engine[Motor Relacional] Engine -->|Solicita Página 1:500| BP{Buffer Pool} BP -->|¿Está en Caché?| Check Check -- SI (Logical Read) --> RAM_HIT[Retorno Instantáneo] Check -- NO (Physical Read) --> DISK[(Disco SSD)] DISK -->|Copia Página a RAM| BP style BP fill:#15803d,stroke:#fff,stroke-width:2px style DISK fill:#2472E3,stroke:#FFFFFF style RAM_HIT fill:#facc15,color:#000,stroke:none style Engine fill:#2563eb,color:#fff
Logical Read (El Bueno) La página ya estaba en memoria. Latencia: Nanosegundos.
Tu objetivo: Buffer Cache Hit Ratio > 99%.
Physical Read (El Malo) Hubo que ir al disco. Latencia: Milisegundos (x1000 más lento).
Causa bloqueos de espera (PAGEIOLATCH).

4. B-Trees: Navegación Inteligente

Balanced Trees O(log N)

Los índices no son listas planas; son pirámides. El motor "baja" por los niveles del árbol comparando valores hasta llegar a la hoja que contiene el dato.

graph TD Root[Página Raíz] --> |1-500| Inter1[Nivel Intermedio] Root --> |501-1000| Inter2[Nivel Intermedio] Inter1 --> |1-100| Leaf1[Hoja: Datos A-C] Inter1 --> |101-200| Leaf2[Hoja: Datos D-F] Inter2 --> |501-600| Leaf3[Hoja: Datos M-O] Inter2 --> |601-700| Leaf4[Hoja: Datos P-R] style Root fill:#fef9c3,stroke:#eab308,stroke-width:4px style Inter1 fill:#bae6fd,stroke:#0ea5e9 style Inter2 fill:#bae6fd,stroke:#0ea5e9 style Leaf1 fill:#bbf7d0,stroke:#22c55e,stroke-dasharray: 5 5 style Leaf2 fill:#bbf7d0,stroke:#22c55e,stroke-dasharray: 5 5 style Leaf3 fill:#bbf7d0,stroke:#22c55e,stroke-dasharray: 5 5 style Leaf4 fill:#bbf7d0,stroke:#22c55e,stroke-dasharray: 5 5

Clustered vs Non-Clustered

En el diagrama de arriba: Si es un Clustered Index, las cajas verdes (Hojas) contienen TODA LA FILA de datos.
Si es un Non-Clustered Index, las cajas verdes solo contienen un puntero (como el número de página de un libro) que te dice dónde buscar el resto de la fila.

Laboratorio Práctico

El Desafío: NYC Taxi Data

Hemos cubierto la teoría. Ahora te toca optimizar 3 millones de registros reales. Elige tu misión.