Birçok forumda ve birçok blogda bir sayfanın aşağıda gösterildiği gibi oluştuğunu okumaya devam ediyorum: Sayfa Boyutu: 16 x 512B = 8192B Sayfa Başlığı: = 96B Maksimum In_Row Satır: = 8060B
Bu (8192-96-8060) B = 36B bırakır.
Tamam, bu mantıklı ve doğru. Benim sorum şu: neden bu kadar çok insan kalan 36B'nin slot dizisi için ayrıldığını söylüyor?
Açıktır ki, yuva dizisi sayfadaki satır başına 2B verir; yani 2B kadar küçük ve 1472B kadar büyük olabilir:
2B: 1 satır * 2B = 2B
1472B: 8096B = n * 9B (ekli min. Satır boyutu ... tekli TINYINT sütununu düşün) + n * 2B (satır başına yuva dizisi maliyeti) => 8096 = 11n => n = 8096/11 = 736.
736 * 2B = 1472B.
Bu beni 14B sürüm etiketi nedeniyle 20'ye getiriyor.
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
Başka bir örnek. 49'dan 50'ye giderseniz, VARCHAR'ın (MAX) LOB_DATA'ya gitmesini sağlarsınız.
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
SQL Server 2012'de bile bu sorunun devam ettiği görülüyor. @SQLKiwi bu gönderiyi Kimberly Tripp tarafından gösteriyor - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .