ฉันสร้างตารางต่อไปนี้:
CREATE TABLE dbo.TestStructure
(
id INT NOT NULL,
filler1 CHAR(36) NOT NULL,
filler2 CHAR(216) NOT NULL
);
จากนั้นสร้างดัชนีคลัสเตอร์:
CREATE CLUSTERED INDEX idx_cl_id
ON dbo.TestStructure(id);
ต่อไปฉันเติมด้วย 30 แถวแต่ละขนาดคือ 256 ไบต์ (ตามประกาศตาราง):
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;
ตอนนี้จากข้อมูลที่ฉันอ่านใน "ชุดฝึกอบรม (สอบ 70-461): การสืบค้น Microsoft SQL Server 2012 (Itzik Ben-Gan)" หนังสือ:
SQL Server จะจัดระเบียบข้อมูลในไฟล์ข้อมูลภายในเพจ หน้าคือหน่วย 8 KB และเป็นของวัตถุเดียว; ตัวอย่างเช่นไปยังตารางหรือดัชนี หน้าเป็นหน่วยการอ่านและการเขียนที่เล็กที่สุด หน้ามีการจัดระเบียบเพิ่มเติมในขอบเขต ขอบเขตประกอบด้วยแปดหน้าต่อเนื่องกัน หน้าจากขอบเขตสามารถเป็นของวัตถุเดียวหรือหลายวัตถุ หากหน้าเป็นของวัตถุหลาย ๆ อันขอบเขตก็จะถูกเรียกว่าเป็นขอบเขตผสม หากหน้าเป็นของวัตถุเดียวขอบเขตจะเรียกว่าขอบเขตเท่ากัน SQL Server เก็บแปดหน้าแรกของวัตถุใน extents ผสม เมื่อวัตถุมีแปดหน้าเกินกว่านั้น SQL Server จะจัดสรรขอบเขตเพิ่มเติมให้กับวัตถุนี้ กับองค์กรนี้วัตถุขนาดเล็กเสียพื้นที่น้อยลงและวัตถุขนาดใหญ่มีการแยกส่วนน้อย
ดังนั้นที่นี่ฉันมีหน้าผสมขนาด 8KB หน้าแรกที่เติมด้วย 7680 ไบต์ (ฉันได้แทรกแถวขนาด 30 คูณ 256 ไบต์ดังนั้น 30 * 256 = 7680) เพื่อตรวจสอบขนาดที่ฉันเรียกใช้ตรวจสอบขนาด proc - มันส่งกลับผลลัพธ์ต่อไปนี้
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
ดังนั้น 16 KB จะถูกจองไว้สำหรับตารางหน้า 8 KB แรกสำหรับเพจรูต IAM หน้าที่สองสำหรับหน้าหน่วยเก็บข้อมูลลีฟซึ่งเป็น 8KB ที่มีการยึดครองของ ~ 7.5 KB ตอนนี้เมื่อฉันแทรกแถวใหม่ด้วย 256 ไบต์:
INSERT INTO dbo.TestStructure (id, filler1, filler2)
VALUES (1, 'a', 'b');
ไม่ได้เก็บไว้ในหน้าเดียวกันแม้ว่าจะมีพื้นที่ 256 ไบต์ (7680 b + 256 = 7936 ซึ่งยังคงมีขนาดเล็กกว่า 8KB) หน้าข้อมูลใหม่จะถูกสร้างขึ้น แต่แถวใหม่อาจพอดีกับหน้าเก่าเดิม เหตุใด SQL Server จึงสร้างหน้าใหม่เมื่อสามารถประหยัดพื้นที่และเวลาในการค้นหาซื้อให้แทรกในหน้าเว็บที่มีอยู่
หมายเหตุ: สิ่งเดียวกันนี้เกิดขึ้นในดัชนีฮีป