Si intenta crear su tabla sin la restricción PK agrupada, obtendrá un error ligeramente diferente:
Msg 1701, Nivel 16, Estado 1, Línea 1 Error al crear o modificar la tabla 'Mytable' porque el tamaño mínimo de fila sería 8067, incluidos 1530 bytes de sobrecarga interna. Esto excede el tamaño máximo de fila de tabla permitido de 8060 bytes.
En este mensaje de error, puede ver que hay 1530 bytes de sobrecarga interna para la compresión de la página.
Ahora, puedes hacer los cálculos:
- 8 bytes para
bigint
MyTableID
- 4 bytes para
int
LastColumn
- 9 bytes para cada una de las 593
numeric(19,4)
columnas (5337 bytes en total)
- 1530 bytes de sobrecarga de compresión
Entonces, 8 + 4 + (593 * 9) + 1530 = 6879.
Espera un segundo ... Eso todavía está por debajo de 8060. ¿Qué pasa con eso?
El algoritmo de compresión de página en realidad apila varios algoritmos de compresión juntos. El primer paso es aplicar compresión ROW. La sobrecarga de la compresión de filas no se incluye en los 1530 bytes de sobrecarga enumerados en ese mensaje de error.
Puede leer más sobre cómo funciona la compresión de filas aquí en mi blog y aquí en BOL . numeric
Notarás en el artículo de BOL que describe el almacenamiento como "Este almacenamiento es exactamente el mismo que el formato de almacenamiento vardecimal", pero no explica vardecimal
. Esta publicación cubre vardecimal
un poco más, esencialmente, agrega 2 bytes de sobrecarga por columna para almacenar la longitud real (similar a lo que varchar
hace).
La compresión de filas requerirá 2 bytes adicionales para cada una de las 593 numeric
columnas, más bigint
y int
requerirá 1 byte de sobrecarga cada una.
Los requisitos de almacenamiento comprimido por filas serían:
- 8 bytes + 1 byte de gastos generales para
bigint
MyTableID
int
Sobrecarga de 4 bytes + 1 byte para LastColumn
- 9 bytes + 2 bytes de sobrecarga para cada una de las 593
numeric(19,4)
columnas
- 1188 bytes de sobrecarga de compresión ROW
8 + 4 + (593 * 9) = 5349 bytes de datos
1 + 1 + (593 * 2) = sobrecarga de compresión de fila de 1188 bytes
6537 bytes en total para el esquema comprimido por filas
Ahora que tenemos el tamaño de fila para el esquema comprimido de fila, podemos volver a ver nuestras matemáticas. El tamaño de fila comprimido por página será el tamaño de datos + sobrecarga de compresión de fila + sobrecarga de compresión de página:
- 8 bytes para
bigint
MyTableID
- 4 bytes para
int
LastColumn
- 9 bytes para cada una de las 593
numeric(19,4)
columnas
- 1188 bytes de sobrecarga de compresión ROW
- 1530 bytes de sobrecarga de compresión PAGE
5349 bytes de datos
Sobrecarga de compresión de fila de + 1188 bytes
Sobrecarga de compresión de página de + 1530 bytes
8067 bytes en total