Aşağıdaki tabloyu oluşturduk:
CREATE TABLE dbo.TestStructure
(
id INT NOT NULL,
filler1 CHAR(36) NOT NULL,
filler2 CHAR(216) NOT NULL
);
ve sonra kümelenmiş bir dizin yarattı:
CREATE CLUSTERED INDEX idx_cl_id
ON dbo.TestStructure(id);
Sonra ben her boyutu 256 bayt (tablo beyanı dayalı) 30 satır ile doldurdu:
DECLARE @i AS int = 0;
WHILE @i < 30
BEGIN
SET @i = @i + 1;
INSERT INTO dbo.TestStructure (id, filler1, filler2)
VALUES (@i, 'a', 'b');
END;
Şimdi "Eğitim Seti (Sınav 70-461): Microsoft SQL Server 2012'yi Sorgulama (Itzik Ben-Gan)" kitabında okuduğum bilgilere dayanarak:
SQL Server bir veri dosyasındaki verileri dahili olarak sayfalar halinde düzenler. Bir sayfa 8 KB'lık bir birimdir ve tek bir nesneye aittir; örneğin, bir tabloya veya bir dizine. Sayfa en küçük okuma ve yazma birimidir. Sayfalar ayrıca uzantılar halinde düzenlenir. Bir kapsam birbirini takip eden sekiz sayfadan oluşur. Bir derecedeki sayfalar tek bir nesneye veya birden çok nesneye ait olabilir. Sayfalar birden çok nesneye aitse, kapsam karışık bir kapsam olarak adlandırılır; Eğer sayfalar tek bir nesneye aitse, o zaman bu muntazam bir boyut olarak adlandırılır. SQL Server, bir nesnenin ilk sekiz sayfasını karışık uzantılarda saklar. Bir nesne sekiz sayfayı aştığında, SQL Server bu nesne için ek tek biçimli uzantılar ayırır. Bu organizasyonla, küçük nesneler daha az yer kaplar ve büyük nesneler daha az parçalanır.
Bu yüzden burada, 7680 bayt ile doldurulmuş ilk karışık genişlikteki 8KB sayfaya sahibim (30 kez 256 bayt boyut satırı, yani 30 * 256 = 7680) ekledim, boyutu kontrol işlemi yaptığım boyutu kontrol etmek için - aşağıdaki sonucu döndürür
index_type_desc: CLUSTERED INDEX
index_depth: 1
index_level: 0
page_count: 1
record_count: 30
avg_page_space_used_in_percent: 98.1961947121324
name : TestStructure
rows : 30
reserved : 16 KB
data : 8 KB
index_size : 8 KB
unused : 0 KB
Yani 16 KB tablo için ayrılmıştır, ilk 8 KB sayfa Kök IAM sayfası için, ikincisi ~ 7.5 KB işgali ile 8KB olan yaprak veri depolama sayfası içindir, şimdi 256 Byte ile yeni bir satır eklediğimde:
INSERT INTO dbo.TestStructure (id, filler1, filler2)
VALUES (1, 'a', 'b');
256 baytlık bir alana sahip olmasına rağmen (7680 b + 256 = 7936 hala 8KB'den küçük) aynı sayfada depolanmaz, yeni bir veri sayfası oluşturulur, ancak bu yeni satır aynı eski sayfaya sığabilir , SQL Server alandan tasarruf edebildiğinde neden yeni bir sayfa oluşturuyor ve arama süresi mevcut sayfaya ekleyerek satın alıyor?
Not: yığın dizininde de aynı şey oluyor.