Slot Array und Gesamtseitengröße

13

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

outwire
quelle
Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Paul White setzt Monica wieder ein

Antworten:

8

Wenn Seiten für interne Zwecke wie Sortierläufe verwendet werden, beträgt die maximale Zeilengröße 8094 Byte . Für Datenseiten beträgt die maximale Zeilengröße einschließlich des internen Zeilenoverheads 8060 Byte .

Der interne Zeilen-Overhead kann erheblich erweitert werden, wenn bestimmte Modulfunktionen verwendet werden. Die Verwendung von Spalten mit geringer Dichte reduziert beispielsweise die vom Benutzer zugängliche Datengröße auf 8019 Byte.

Das einzige mir bekannte Beispiel für den Overhead externer Zeilen bis zu SQL Server 2012 sind die 14 Byte, die für versionierte Zeilen benötigt werden . Durch diesen externen Overhead wird der maximale Speicherplatz für eine einzelne Zeile auf 8074 Byte plus 2 Byte für den einzelnen Slot-Array-Eintrag erhöht, sodass insgesamt 8076 Byte verfügbar sind. Dies sind immer noch 20 Byte weniger als die 8096-Grenze (8192 Seitengröße - 96 Byte fester Header).

Die wahrscheinlichste Erklärung ist, dass das ursprüngliche 8060-Byte-Limit 34 Byte für zukünftige Erweiterungen übrig ließ, von denen 14 für die Implementierung der Zeilenversionierung verwendet wurden.

Paul White
quelle