मैंने निम्नलिखित तालिका बनाई है:
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 (इट्ज़िक बेन-गान) को छोड़ कर पुस्तक:
SQL सर्वर आंतरिक रूप से पृष्ठों में डेटा फ़ाइल में डेटा को व्यवस्थित करता है। एक पृष्ठ 8 केबी इकाई है और एक एकल वस्तु के अंतर्गत आता है; उदाहरण के लिए, एक तालिका या एक सूचकांक के लिए। एक पृष्ठ पढ़ने और लिखने की सबसे छोटी इकाई है। पेज आगे विलुप्त होने में व्यवस्थित हैं। एक सीमा में लगातार आठ पृष्ठ होते हैं। एक सीमा से पृष्ठ किसी एक वस्तु या कई वस्तुओं से संबंधित हो सकते हैं। यदि पृष्ठ कई वस्तुओं से संबंधित हैं, तो सीमा को मिश्रित सीमा कहा जाता है; यदि पृष्ठ एक ही वस्तु के हैं, तो सीमा को एक समान सीमा कहा जाता है। SQL सर्वर किसी ऑब्जेक्ट के पहले आठ पृष्ठों को मिश्रित एक्स्टेंट में संग्रहीत करता है। जब कोई ऑब्जेक्ट आठ पृष्ठों से अधिक हो जाता है, तो SQL सर्वर इस ऑब्जेक्ट के लिए अतिरिक्त एकसमान अंश आवंटित करता है। इस संगठन के साथ, छोटी वस्तुएं कम जगह बर्बाद करती हैं और बड़ी वस्तुएं कम खंडित होती हैं।
इसलिए यहाँ मेरे पास पहला मिश्रित सीमा 8KB पृष्ठ है, जिसकी आबादी 7680 बाइट्स से है (मैंने 30 बार 256 बाइट आकार पंक्ति में डाली है, इसलिए 30 * 256 = 7680), आकार की जांच करने के लिए मैंने साइज़ चेक प्रोक खरीद की है - यह निम्न परिणाम देता है।
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 पृष्ठ के लिए है, दूसरा पत्ता डेटा भंडारण पृष्ठ के लिए है जो ~ 7.5 KB के कब्जे के साथ 8KB है, अब जब मैं 256 बाइट के साथ एक नई पंक्ति सम्मिलित करता हूं:
INSERT INTO dbo.TestStructure (id, filler1, filler2)
VALUES (1, 'a', 'b');
यह एक ही पृष्ठ में संग्रहीत नहीं है, हालांकि इसमें 256 बाइट का स्थान है (7680 b + 256 = 7936 जो अभी भी 8KB से छोटा है), एक नया डेटा पेज बनाया गया है, लेकिन यह नया पंक्ति उसी पुराने पृष्ठ पर फिट हो सकता है SQL सर्वर एक नया पेज क्यों बनाता है, जब वह अंतरिक्ष को बचा सकता है और मौजूदा पेज में उसे डालते समय खोज सकता है?
नोट: एक ही बात ढेर सूचकांक में हो रहा है।