De acordo com os documentos do SQL Server , parece que se eu tiver uma ou mais colunas varchar/nvarchar que fazem com que o comprimento da linha exceda 8 KB, o SQL Server irá lidar com isso magicamente.
Cenário:
- A tabela tem 100 colunas -
O comprimento máximo da linha atual é de 3,4 KB
- Mas se cada campo varchar/nvarchar fosse preenchido no máximo, o comprimento da linha atingiria 14 KB
Da forma como interpreto os detalhes do Books Online vinculados acima, esse cenário funcionará bem (por exemplo, nada quebrará e tudo funcionará).
Minha suposição é verdadeira?
Usando os recursos não documentados
DBCC IND
eDBCC PAGE
, você pode facilmente dizer exatamente o que o SQL Server faz com linhas que excedem o tamanho "máximo" de 8.060 bytes.Para mostrar como isso funciona, criarei uma tabela simples em tempdb onde a largura da linha é de 10.000 bytes e, em seguida, executarei
DBCC IND
para obter uma lista de páginas onde os dados estão armazenados. Vamos então correrDBCC PAGE
para ver o conteúdo dessas páginas.Primeiro, criamos a tabela com uma largura máxima de 10.000 bytes:
E preencha isso com uma única linha:
Aqui estamos criando uma tabela para conter a
DBCC IND
saída e preenchendo essa tabela:Finalmente, este cursor itera sobre o conteúdo da
dbo.IndexDetails
tabela mostrando o conteúdo da página para cada página usada pela tabela:Os bits interessantes de saída do cursor são exibidos na guia Mensagens no SSMS.
Esta é a primeira página. Observe o
Record Type = PRIMARY_RECORD
:Eu removi o conteúdo hexaxdecimal do despejo de página real para manter minha postagem abaixo do limite de 30.000 caracteres. Como você pode ver no despejo de página acima, a página principal no meu exemplo não contém as 3 primeiras colunas,
A
,B
eC
- elas são armazenadas na região de estouro de linha, mostrada a seguir, comRecord Type = BLOB_FRAGMENT
: