Matrice di slot e dimensione totale della pagina


13

Continuo a leggere in molti forum e in molti blog che una pagina è composta come mostrato di seguito: Dimensione pagina: 16 x 512 B = 8192 B Intestazione della pagina: = 96 B Riga In_Row massima: = 8060 B

Questo lascia (8192-96-8060) B = 36B.

Ok, questo è logico e corretto. La domanda che ho è questa: perché così tante persone dicono che il restante 36B è riservato per l'array di slot?

Ovviamente, l'array di slot dà 2B per riga sulla pagina; quindi, può essere piccolo quanto 2B e grande quanto 1472B:

2B: 1 riga * 2B = 2B

1472B: 8096B = n * 9B (dimensione minima della riga con overhead ... pensa una singola colonna TINYINT) + n * 2B (costo dell'array di slot per riga) => 8096 = 11n => n = 8096/11 = 736.

736 * 2B = 1472B.

Questo mi porta a 20 grazie al tag della versione 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

Un altro esempio. Se vai a 50 da 49, ottieni VARCHAR (MAX) andando a 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

Sembra che questo problema permanga, anche in SQL Server 2012. @SQLKiwi indica questo post di Kimberly Tripp - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Paul White 9

Risposte:


8

Laddove le pagine vengono utilizzate per scopi interni come le esecuzioni di ordinamento, la dimensione massima della riga è 8094 byte . Per le pagine di dati, la dimensione massima nella riga compreso l'overhead della riga interna è 8060 byte .

L'overhead delle righe interne può espandersi in modo significativo se alcune funzionalità del motore sono in uso. Ad esempio, l'utilizzo di colonne sparse riduce la dimensione dei dati accessibili all'utente a 8019 byte.

L'unico esempio di sovraccarico di riga esterno che conosco fino a SQL Server 2012 sono i 14 byte necessari per le righe con versione . Questo sovraccarico esterno porta il massimo utilizzo di spazio per una singola riga a 8074 byte, più 2 byte per la voce dell'array a slot singolo, per un totale di 8076 byte. Questo è ancora 20 byte al di sotto del limite 8096 (dimensioni della pagina 8192 - intestazione fissa a 96 byte).

La spiegazione più probabile è che il limite originale di 8060 byte ha lasciato 34 byte per future espansioni, di cui 14 sono state utilizzate per l'implementazione del versioning delle righe.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.