Alan Dizisi ve Toplam Sayfa Boyutu


13

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


Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı .
Paul White 9

Yanıtlar:


8

Sayfaların sıralama işlemleri gibi dahili amaçlar için kullanıldığı durumlarda, maksimum satır boyutu 8094 bayttır . Veri sayfaları için, dahili satır ek yükü dahil maksimum satır içi boyutu 8060 bayttır .

Bazı motor özellikleri kullanılıyorsa, dahili sıra yükü önemli ölçüde genişleyebilir. Örneğin, seyrek sütunlar kullanmak kullanıcı tarafından erişilebilen veri boyutunu 8019 bayta düşürür.

SQL Server 2012'ye kadar bildiğim harici satır ek yükünün tek örneği, sürümlendirilmiş satırlar için gereken 14 bayttır . Bu harici ek yük, tek bir satır için maksimum alan kullanımını 8074 bayta ve tek yuva dizi girişi için 2 bayta getirir ve toplam 8076 bayt yapar. Bu hala 8096 sınırının 20 bayt altındadır (8192 sayfa boyutu - 96 bayt sabit üstbilgi).

En olası açıklama orijinal 8060 bayt sınırı 14 satır-sürüm uygulanması için kullanılan edildiği gelecekteki genişleme 34 bayt, sol olmasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.