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 / .