2013-02-06 48 views
5

मेरे पास एक साझा होस्टिंग पर एक एमएस एसक्यूएल सर्वर 2008 डेटाबेस है और मुझे जितना संभव हो सके उपयोग की गई संग्रहण स्थान को कम करने की आवश्यकता है। मेरी सबसे बड़ी तालिका में निम्नलिखित परिभाषा है:पंक्ति आकार ओवरहेड

CREATE TABLE [stage](
    [station_id] [smallint] NOT NULL, 
    [time_utc] [smalldatetime] NOT NULL, 
    [stage_mm] [smallint] NOT NULL, 
CONSTRAINT [PK_stage] PRIMARY KEY CLUSTERED ([station_id] ASC,[time_utc] ASC) 

मैंने अपनी तालिका में प्रति रिकॉर्ड बाइट्स की औसत संख्या को खोजने का प्रयास किया। सिद्धांत के अनुसार आकार होना चाहिए: 4 बी (पंक्ति शीर्षलेख) + 2 बी (छोटा) + 4 बी (smalldatetime) + 2 बी (छोटा) जो 12 बाइट्स है।

हालांकि, जब मैं कमांड भाग गया:

dbcc showcontig ('stage') with tableresults 

इससे पता चलता है: MinimumRecordSize = 15, MaximumRecordSize = 15 तो एसक्यूएल सर्वर के अनुसार, रिकॉर्ड प्रति बाइट्स 15 और नहीं 12 संख्या 15 बाइट्स जब मैं तालिका द्वारा ली गई कुल डिस्क स्थान को देखता हूं और पंक्तियों की संख्या से विभाजित करता हूं तो प्रति रिकॉर्ड भी सही लगता है।

3 अतिरिक्त बाइट्स क्या ले रहा है ???

उत्तर

5

उन 3 अतिरिक्त न्यूल बिटमैप से हैं। According to Paul's post, यह उन पंक्तियों के लिए सहेजता है जो कॉलम में सभी स्पेस हैं (SQL सर्वर 2008 में शुरू)।

और this BOL post में एक पंक्ति के अनुसार, नल बिटमैप = 2 + ((number_columns_in_clustered_index + 7)/8) है। आपके मामले में, 3.

+0

स्पष्टीकरण के लिए धन्यवाद। तो ऐसा प्रतीत होता है कि मेरे मामले में SQL सर्वर 2008 में 7 बाइट से कम तक पंक्ति ओवरहेड को कम करना असंभव है। – jirikadlec2

1

मैं आंशिक रूप से @ मैट से सहमत हूं, 2 बिट्स को पूर्ण बिटमैप के लिए आवश्यक है जो सही है।

हालांकि, अंतिम बाइट प्रति कॉलम की संख्या से उपभोग किया जाता है। मतलब, अगर मेरे पास मेरी तालिका में 6 कॉलम हैं तो मुझे 1 बाइट (6-बिट्स) की आवश्यकता होगी, या यदि मेरे पास 12 कॉलम हैं तो मुझे 2 बाइट्स (12-बिट्स) की आवश्यकता होगी।

आपके मामले में 3 कॉलम इसलिए यह सिर्फ 1 बाइट ले लिया है देखते हैं।