sql >> Base de Datos >  >> RDS >> Sqlserver

Tamaño máximo de fila de SQL Server frente a tamaño de Varchar (máx.)

En Microsoft SQL Server, los datos (que incluyen índices) se almacenan en una o más "páginas" de 8k (8192 bytes). Hay diferentes tipos de páginas que se pueden usar para manejar varias situaciones (por ejemplo, Datos, LOB, Índice, Mapa de asignación, etc.). Cada página tiene un encabezado que son metadatos sobre esa página y lo que contiene.

La mayoría de los datos se almacenan en la fila misma y una o más de estas filas se almacenan a su vez en una página para "datos en la fila". Debido al espacio que ocupa el encabezado de fila, lo más grande que puede ser una fila (para datos "en fila") es de 8060 bytes.

Sin embargo, no todos los datos se almacenan en la fila. Para ciertos tipos de datos, los datos se pueden almacenar en una página de "datos LOB" mientras se deja un puntero en los datos "en fila":

  • Tipos LOB heredados/obsoletos que ya nadie debería usar (TEXT , NTEXT y IMAGE ), de forma predeterminada, siempre almacenan sus datos en páginas LOB y siempre usan un puntero de 16 bytes a esa página LOB.

  • Los tipos LOB más nuevos (VARCHAR(MAX) , NVARCHAR(MAX) , VARBINARY(MAX) y XML ), de forma predeterminada, intentará ajustar los datos directamente en la fila si cabe. De lo contrario, almacenará los datos en páginas LOB y utilizará un puntero de 24 a 72 bytes (según el tamaño de los datos LOB).

Así es como podrías almacenar hasta 78 GB + 4 bytes (no te olvides del INT Clave principal;-) en una sola fila:el tamaño máximo de la fila estará entre 940 bytes ((39 * 24) + 4) y 2812 bytes ((39 * 72) + 4). Pero de nuevo, ese es solo el rango máximo; si los datos en cada uno de los 39 VARCHAR(MAX) campos es de solo 10 bytes, luego todos los datos se almacenarán en fila y el tamaño de la fila será de 394 bytes ((39 * 10) + 4).

Dado que tiene tantos campos de longitud variable (ya sean MAX o no), la única forma de estimar el tamaño de las filas futuras es tener una buena idea de qué datos almacenará en esta tabla. Aunque una tabla con todos, o incluso la mayoría, de los tipos de datos MAX implica que nadie tiene idea de lo que se almacenará en esta tabla.

En ese sentido, debe señalarse que esta es una tabla modelada horriblemente/uso horrible de los campos de tipo de datos MAX, y debe refactorizarse.

Para obtener más detalles sobre cómo se estructuran las páginas de datos, consulte mi respuesta a la siguiente pregunta de DBA.StackExchange:

SUMA de DATALENGTHs que no coinciden con el tamaño de la tabla de sys.allocation_units