Tableau des emplacements et taille de page totale

13

Je continue à lire dans de nombreux forums et sur de nombreux blogs qu'une page est composée comme indiqué ci-dessous: Taille de la page: 16 x 512B = 8192B En-tête de page: = 96B Ligne In_Row maximale: = 8060B

Cela laisse (8192 - 96 - 8060) B = 36B.

Ok, c'est logique et correct. La question que je me pose est la suivante: pourquoi tant de gens disent-ils que le 36B restant est réservé pour la baie de slots?

De toute évidence, le tableau des emplacements donne 2B par ligne sur la page; ainsi, il peut être aussi petit que 2B et aussi grand que 1472B:

2B: 1 ligne * 2B = 2B

1472B: 8096B = n * 9B (taille de ligne minimale avec surcharge ... pensez à une seule colonne TINYINT) + n * 2B (coût du tableau de logements par ligne) => 8096 = 11n => n = 8096/11 = 736.

736 * 2B = 1472B.

Cela m'amène à 20 en raison de la balise de version 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 autre exemple. Si vous passez à 50 sur 49, vous obtenez le VARCHAR (MAX) allant à 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

Il semble que ce problème persiste, même dans SQL Server 2012. @SQLKiwi pointe vers ce message de Kimberly Tripp - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .

sans fil
la source
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Paul White 9

Réponses:

8

Lorsque les pages sont utilisées à des fins internes telles que les exécutions de tri, la taille de ligne maximale est de 8094 octets . Pour les pages de données, la taille maximale en ligne, y compris la surcharge de ligne interne, est de 8060 octets .

Les frais généraux des lignes internes peuvent augmenter considérablement si certaines fonctionnalités du moteur sont utilisées. Par exemple, l'utilisation de colonnes éparses réduit la taille des données accessibles à l'utilisateur à 8019 octets.

Le seul exemple de surcharge de ligne externe que je connaisse jusqu'à SQL Server 2012 est les 14 octets nécessaires pour les lignes versionnées . Cette surcharge externe porte l'utilisation maximale de l'espace pour une seule ligne à 8074 octets, plus 2 octets pour l'entrée de la baie à un seul emplacement, soit 8076 octets au total. C'est toujours 20 octets de moins que la limite de 8096 (taille de page 8192 - en-tête fixe de 96 octets).

L' explication la plus probable est que la limite d'origine de 8060 octets a laissé 34 octets pour une expansion future, dont 14 ont été utilisés pour l'implémentation de la version en ligne.

Paul White
la source