Sigo leyendo en muchos foros y en muchos blogs que una página está compuesta como se muestra a continuación: Tamaño de página: 16 x 512B = 8192B Encabezado de página: = 96B Fila máxima en fila: = 8060B
Esto deja (8192-96-8060) B = 36B.
Ok, esto es lógico y correcto. La pregunta que tengo es esta: ¿por qué tanta gente dice que el 36B restante está reservado para la matriz de ranuras?
Obviamente, la matriz de ranuras da 2B por fila en la página; entonces, puede ser tan pequeño como 2B y tan grande como 1472B:
2B: 1 fila * 2B = 2B
1472B: 8096B = n * 9B (tamaño de fila mínimo con sobrecarga ... piense en una sola columna TINYINT) + n * 2B (costo de matriz de ranuras por fila) => 8096 = 11n => n = 8096/11 = 736.
736 * 2B = 1472B.
Esto me lleva a 20 debido a la etiqueta de versión 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
Otro ejemplo. Si vas a 50 de 49, obtienes el VARCHAR (MAX) yendo 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
Parece que este problema persiste, incluso en SQL Server 2012. @SQLKiwi señala esta publicación de Kimberly Tripp - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .
fuente
Respuestas:
Cuando las páginas se utilizan con fines internos, como ejecuciones de clasificación, el tamaño máximo de fila es 8094 bytes . Para las páginas de datos, el tamaño máximo de la fila, incluida la sobrecarga interna de la fila, es de 8060 bytes .
La sobrecarga interna de la fila puede expandirse significativamente si se usan ciertas características del motor. Por ejemplo, el uso de columnas dispersas reduce el tamaño de datos accesible para el usuario a 8019 bytes.
El único ejemplo de sobrecarga de filas externas que conozco hasta SQL Server 2012 son los 14 bytes necesarios para las filas versionadas . Esta sobrecarga externa eleva el uso de espacio máximo para una sola fila a 8074 bytes, más 2 bytes para la entrada de matriz de ranura única, lo que hace un total de 8076 bytes. Esto todavía es 20 bytes por debajo del límite 8096 (tamaño de página 8192 - encabezado fijo de 96 bytes).
La explicación más probable es que el límite original de 8060 bytes dejó 34 bytes para una futura expansión, de los cuales 14 se usaron para la implementación de versiones de filas.
fuente