Se você tentar criar sua tabela sem a restrição PK em cluster e obterá um erro ligeiramente diferente:
Msg 1701, Nível 16, Estado 1, Linha 1 A criação ou alteração da tabela 'Mytable' falhou porque o tamanho mínimo da linha seria 8067, incluindo 1530 bytes de sobrecarga interna. Isso excede o tamanho máximo permitido da linha da tabela de 8060 bytes.
Nesta mensagem de erro, você pode ver que há 1530 bytes de sobrecarga interna para compactação de página.
Agora, você pode fazer as contas:
- 8 bytes para
bigint
MyTableID
- 4 bytes para
int
LastColumn
- 9 bytes para cada uma das 593
numeric(19,4)
colunas (5337 bytes no total)
- 1530 bytes de sobrecarga de compactação
Então, 8 + 4 + (593 * 9) + 1530 = 6879.
Espere um segundo ... Ainda está abaixo de 8060. O que há com isso ?!
O algoritmo de compactação de página realmente empilha vários algoritmos de compactação juntos. O primeiro passo é aplicar a compressão ROW. A sobrecarga da compactação de linha não está incluída nos 1530 bytes de sobrecarga listados nessa mensagem de erro.
Você pode ler mais sobre como a compactação de linhas funciona aqui no meu blog e aqui no BOL . Você observará no artigo da BOL que descreve o numeric
armazenamento como "Este armazenamento é exatamente igual ao formato de armazenamento vardecimal", mas não explica vardecimal
. Este post aborda vardecimal
um pouco mais - essencialmente, ele adiciona 2 bytes de sobrecarga por coluna para armazenar o comprimento real (semelhante ao que varchar
faz).
A compactação de linha exigirá 2 bytes adicionais para cada uma das 593 numeric
colunas, mais o bigint
e int
exigirá 1 byte de sobrecarga cada.
Os requisitos de armazenamento compactado em linha seriam:
- 8 bytes + sobrecarga de 1 byte para
bigint
MyTableID
- Sobrecarga de 4 bytes + 1 byte para
int
LastColumn
- Sobrecarga de 9 bytes + 2 bytes para cada uma das 593
numeric(19,4)
colunas
- 1188 bytes de sobrecarga de compactação ROW
8 + 4 + (593 * 9) = 5349 bytes de dados
1 + 1 + (593 * 2) = 1188 bytes de sobrecarga de compactação de linha
6537 bytes no total para esquema compactado em linha
Agora que temos o tamanho da linha para o esquema compactado, podemos revisar nossa matemática. O tamanho da linha compactada na página será o tamanho dos dados + sobrecarga de compactação de linha + sobrecarga de compactação de página:
- 8 bytes para
bigint
MyTableID
- 4 bytes para
int
LastColumn
- 9 bytes para cada uma das 593
numeric(19,4)
colunas
- 1188 bytes de sobrecarga de compactação ROW
- 1530 bytes de sobrecarga de compactação PAGE
Dados de 5349 bytes
Sobrecarga de compactação de linha de + 1188 bytes
+ 1530 bytes de sobrecarga de compactação de página
8067 bytes no total