Matriz de slot e tamanho total da página

13

Continuo lendo em muitos fóruns e em muitos blogs que uma página é composta como mostrado abaixo: Tamanho da página: 16 x 512B = 8192B Cabeçalho da página: = 96B Linha máxima de In_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 de 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 da 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ê passa de 49 a 50, recebe o VARCHAR (MAX) em 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 / .

ooutwire
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Paul White 9

Respostas:

8

Onde as páginas são usadas para fins internos, como execuções de classificação, o tamanho máximo da linha é 8094 bytes . Para páginas de dados, o tamanho máximo em linha, incluindo a sobrecarga interna da linha, é de 8060 bytes .

A sobrecarga interna da linha pode expandir significativamente se certos recursos do mecanismo estiverem em uso. Por exemplo, o uso de colunas esparsas reduz o tamanho dos dados acessíveis ao 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 as linhas com versão . Essa sobrecarga externa eleva o uso máximo de espaço para uma única linha para 8074 bytes, mais 2 bytes para a entrada da matriz de slot único, totalizando 8076 bytes. Isso ainda está 20 bytes abaixo do limite 8096 (tamanho da página 8192 - cabeçalho fixo de 96 bytes).

A explicação mais provável é que o limite original de 8060 bytes deixou 34 bytes para expansão futura, dos quais 14 foram usados ​​para a implementação de versão de linha.

Paul White
fonte