Continuo a ler em muitos fóruns e em muitos blogs que uma página é composta da seguinte forma: Tamanho da página: 16 x 512B = 8192B Cabeçalho da página: = 96B Maximum In_Row Row: = 8060B
Isso deixa (8192 - 96 - 8060)B = 36B.
Ok, isso é lógico e correto. A pergunta que tenho é a seguinte: por que tantas pessoas dizem que os 36B restantes são reservados para a matriz de slots?
Obviamente, a matriz de slots fornece 2B por linha na página; portanto, pode ser tão pequeno quanto 2B e tão grande quanto 1472B:
2B: 1 linha * 2B = 2B
1472B: 8096B = n*9B (tamanho mínimo da linha com sobrecarga...pense em uma única coluna TINYINT) + n*2B (custo da matriz de slots por linha) => 8096 = 11n => n = 8096 / 11 = 736.
736*2B = 1472B.
Isso me leva a 20 devido à tag de versão 14B.
USE master ;
GO
CREATE DATABASE test ;
GO
USE test ;
GO
ALTER DATABASE test
SET ALLOW_SNAPSHOT_ISOLATION ON ;
GO
ALTER DATABASE test
SET READ_COMMITTED_SNAPSHOT ON ;
GO
DROP TABLE tbl ;
GO
CREATE TABLE tbl
(
i CHAR(8000) DEFAULT(REPLICATE('a',8000))
, j CHAR(53) DEFAULT(REPLICATE('a',53))
) ;
INSERT INTO tbl
DEFAULT VALUES ;
GO
DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO
Outro exemplo. Se você for de 49 para 50, obterá o VARCHAR(MAX) indo para LOB_DATA.
DROP TABLE tbl ;
GO
CREATE TABLE tbl
(
i VARCHAR(MAX) DEFAULT(REPLICATE('a',8000))
, j CHAR(49) DEFAULT(REPLICATE('a',49))
) ;
sp_tableoption N'tbl', 'large value types out of row', 'OFF' ;
GO
INSERT INTO tbl
DEFAULT VALUES ;
GO
DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO
Parece que esse problema permanece, mesmo no SQL Server 2012. @SQLKiwi aponta para esta postagem de Kimberly Tripp - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .
Onde as páginas são usadas para fins internos, como execuções de classificação, o tamanho máximo da linha é de 8.094 bytes . Para páginas de dados, o tamanho máximo da linha, incluindo a sobrecarga interna da linha, é de 8.060 bytes .
A sobrecarga da linha interna pode aumentar significativamente se determinados recursos do mecanismo estiverem em uso. Por exemplo, usar colunas esparsas reduz o tamanho dos dados acessíveis pelo usuário para 8019 bytes.
O único exemplo de sobrecarga de linha externa que conheço até o SQL Server 2012 são os 14 bytes necessários para linhas com controle de versão . Essa sobrecarga externa traz o uso máximo de espaço para uma única linha para 8.074 bytes, mais 2 bytes para a entrada da matriz de slot único, totalizando 8.076 bytes. Ainda faltam 20 bytes para o limite de 8096 (tamanho de página de 8192 - cabeçalho fixo de 96 bytes).
A explicação mais provável é que o limite original de 8.060 bytes deixou 34 bytes para expansão futura, dos quais 14 foram usados para a implementação de controle de versão de linha.