Si vous essayez de créer votre table sans la contrainte PK en cluster, et vous obtiendrez une erreur légèrement différente:
Msg 1701, niveau 16, état 1, ligne 1 La création ou la modification de la table 'Mytable' a échoué car la taille de ligne minimale serait 8067, y compris 1530 octets de surcharge interne. Cela dépasse la taille de ligne de table maximale autorisée de 8060 octets.
Dans ce message d'erreur, vous pouvez voir qu'il y a 1530 octets de surcharge interne pour la compression de page.
Maintenant, vous pouvez faire le calcul:
- 8 octets pour
bigint
MyTableID
- 4 octets pour
int
LastColumn
- 9 octets pour chacune des 593
numeric(19,4)
colonnes (5337 octets au total)
- 1530 octets de surcharge de compression
Donc, 8 + 4 + (593 * 9) + 1530 = 6879.
Attendez une seconde .... C'est toujours en dessous de 8060. Qu'est-ce qui se passe?!
L'algorithme de compression de page empile en fait plusieurs algorithmes de compression ensemble. La première étape consiste à appliquer la compression ROW. La surcharge de la compression de ligne n'est pas incluse dans les 1530 octets de surcharge répertoriés dans ce message d'erreur.
Vous pouvez en savoir plus sur le fonctionnement de la compression de lignes ici sur mon blog et ici dans BOL . Vous noterez dans l'article BOL qu'il décrit le numeric
stockage comme «Ce stockage est exactement le même que le format de stockage vardécimal», mais n'explique pas vardecimal
. Ce message couvre vardecimal
un peu plus - essentiellement, il ajoute 2 octets de surcharge par colonne pour stocker la longueur réelle (similaire à ce qui le varchar
fait).
La compression des lignes nécessitera 2 octets supplémentaires pour chacune des 593 numeric
colonnes, plus le bigint
et int
nécessitera 1 octet de surcharge chacun.
Les exigences de stockage compressées par ligne seraient les suivantes:
- 8 octets + 1 octet de surcharge pour
bigint
MyTableID
- 4 octets + 1 octet de surcharge pour
int
LastColumn
- 9 octets + 2 octets de surcharge pour chacune des 593
numeric(19,4)
colonnes
- 1188 octets de surcharge de compression ROW
8 + 4 + (593 * 9) = 5349 octets de données
1 + 1 + (593 * 2) = surcharge de compression de ligne de 1188 octets
6537 octets au total pour le schéma compressé par ligne
Maintenant que nous avons la taille de ligne pour le schéma compressé par ligne, nous pouvons revoir nos calculs. La taille de la ligne compressée sera la taille des données + la surcharge de compression de ligne + la surcharge de compression de page:
- 8 octets pour
bigint
MyTableID
- 4 octets pour
int
LastColumn
- 9 octets pour chacune des 593
numeric(19,4)
colonnes
- 1188 octets de surcharge de compression ROW
- 1530 octets de surcharge de compression PAGE
5349 octets de données
+ 1188 octets de compression de ligne
+ 1530 octets de compression de page
8067 octets au total