Saya telah membuat tabel berikut:
CREATE TABLE dbo.TestStructure
(
id INT NOT NULL,
filler1 CHAR(36) NOT NULL,
filler2 CHAR(216) NOT NULL
);
dan kemudian membuat indeks berkerumun:
CREATE CLUSTERED INDEX idx_cl_id
ON dbo.TestStructure(id);
Berikutnya saya mengisinya dengan 30 baris setiap ukuran adalah 256 byte (berdasarkan tabel deklarasi):
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;
Sekarang berdasarkan informasi yang saya baca di "Pelatihan Kit (Ujian 70-461): Meminta Microsoft SQL Server 2012 (Itzik Ben-Gan)" buku:
SQL Server secara internal mengatur data dalam file data di halaman. Halaman adalah unit 8 KB dan milik satu objek; misalnya, ke tabel atau indeks. Halaman adalah unit terkecil dari membaca dan menulis. Halaman disusun lebih lanjut menjadi luasan. Luasnya terdiri dari delapan halaman berturut-turut. Halaman dari batas tertentu dapat dimiliki oleh satu objek atau beberapa objek. Jika halaman milik beberapa objek, maka luasnya disebut tingkat campuran; jika halaman milik satu objek, maka luasnya disebut tingkat seragam. SQL Server menyimpan delapan halaman pertama objek dalam luasan campuran. Ketika suatu objek melebihi delapan halaman, SQL Server mengalokasikan luasan seragam yang seragam untuk objek ini. Dengan organisasi ini, benda-benda kecil menghabiskan lebih sedikit ruang dan benda-benda besar kurang terfragmentasi.
Jadi di sini saya memiliki halaman 8KB luas campuran pertama, diisi dengan 7680 byte (saya telah memasukkan 30 kali 256 byte ukuran baris, jadi 30 * 256 = 7680), untuk memeriksa ukuran saya telah menjalankan ukuran periksa proc - mengembalikan hasil berikut
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
Jadi 16 KB dicadangkan untuk tabel, halaman 8 KB pertama adalah untuk halaman Root IAM, yang kedua adalah untuk halaman penyimpanan data daun yang 8KB dengan pekerjaan ~ 7,5 KB, sekarang ketika saya memasukkan baris baru dengan 256 Byte:
INSERT INTO dbo.TestStructure (id, filler1, filler2)
VALUES (1, 'a', 'b');
itu tidak disimpan di halaman yang sama meskipun memiliki ruang 256 byte (7680 b + 256 = 7936 yang masih lebih kecil dari 8KB), halaman data baru dibuat, tetapi baris baru itu bisa masuk pada halaman lama yang sama , mengapa SQL Server membuat halaman baru ketika itu bisa menghemat ruang dan mencari waktu membeli memasukkannya di halaman yang ada?
Catatan: hal yang sama terjadi pada heap index.