Ich lese weiterhin in vielen Foren und in vielen Blogs, dass eine Seite wie folgt aufgebaut ist: Seitengröße: 16 x 512B = 8192B Seitenkopf: = 96B Maximale In_Row-Zeile: = 8060B
Dies ergibt (8192 - 96 - 8060) B = 36B.
Ok, das ist logisch und richtig. Die Frage, die ich habe, lautet: Warum sagen so viele Leute, dass die restlichen 36B für das Slot-Array reserviert sind?
Offensichtlich ergibt das Slot-Array 2B pro Zeile auf der Seite; es kann also so klein wie 2B und so groß wie 1472B sein:
2B: 1 Zeile * 2B = 2B
1472B: 8096B = n * 9B (minimale Zeilengröße mit Overhead) + n * 2B (Slot-Array-Kosten pro Zeile) => 8096 = 11n => n = 8096/11 = 736.
736 * 2B = 1472B.
Das bringt mich aufgrund des 14B-Versions-Tags auf 20.
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
Ein anderes Beispiel. Wenn Sie von 49 auf 50 wechseln, wird VARCHAR (MAX) auf LOB_DATA gesetzt.
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
Offenbar bleibt dieses Problem auch in SQL Server 2012 bestehen. @SQLKiwi verweist auf diesen Beitrag von Kimberly Tripp - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .