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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.