मैं कहूंगा कि एक कृत्रिम smallint
जोड़ना यदि तालिका को सावधानीपूर्वक डिज़ाइन किया गया है, तो भंडारण स्थान के मामले में प्राथमिक कुंजी सस्ती होगी।
एक smallint
2 बाइट्स लेता है, जबकि एक character(10)
(जो, प्रति-सहज रूप से, एक varlena
. है ) ASCII वर्ण युक्त, 14 बाइट्स की खपत करेगा।
तालिका में, अतिरिक्त 2 बाइट बेकार हो जाएंगे, लेकिन यह न भूलें कि आपके पास प्राथमिक कुंजी कॉलम पर एक अनुक्रमणिका होगी। तो अनुक्रमित मान वास्तव में दो बार संग्रहीत किया जाएगा:एक बार तालिका में, एक बार अनुक्रमणिका में।
सादगी के लिए, आइए टपल हेडर और अन्य ओवरहेड को अनदेखा करें।
-
ISBN को प्राथमिक कुंजी के रूप में उपयोग करने पर प्रति तालिका पंक्ति में अतिरिक्त 14 बाइट खर्च होंगे।
-
एक
smallint
जोड़ना प्राथमिक कुंजी तालिका में दो बाइट्स और इंडेक्स में दो बाइट्स जोड़ देगी, जिससे कुल चार अतिरिक्त बाइट बन जाएंगे।
तो एक smallint
जोड़ना प्राथमिक कुंजी को स्थान बचाना चाहिए ।
आपको संरेखण के मुद्दों को अनदेखा नहीं करना चाहिए। सभी डेटा प्रकार स्मृति पते पर संग्रहीत होते हैं जो दो की कुछ शक्तियों के गुणक होते हैं। यह प्रोसेसर के आर्किटेक्चर द्वारा आवश्यक है। एक smallint
आमतौर पर संरेखण 2, character
. होता है संरेखण 1 है, जबकि उदाहरण के लिए timestamp
संरेखण 8 है।
इसलिए यदि आपकी तालिका को इस रूप में परिभाषित किया गया है
CREATE TABLE book (
id smallint PRIMARY KEY,
issue_time timestamp with time zone,
isbn character(10)
);
तब तालिका डेटा इस तरह दिखेगा:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | |X|X|X|X|X|X| | | | | | | | | ... (ISBN omitted)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
id padding issue_time
पंक्ति 8-बाइट सीमा पर संरेखित है, और अंत से छह बाइट्स यदि id
. है issue_time
. की शुरुआत तक खाली "पैडिंग बाइट्स" होगा।
इसलिए इसका अधिकतम लाभ उठाने के लिए, आपको यह विचार करना होगा कि आप कॉलम को किस क्रम में परिभाषित करते हैं।
यह सब वास्तविकता में बहुत प्रासंगिक क्यों नहीं है:
5000 या 10000 प्रविष्टियों वाली एक तालिका छोटी होती है, चाहे कुछ भी हो।
हालांकि यहां स्थान को अनुकूलित करने पर खर्च किया गया कोई भी सबसे अच्छा अनावश्यक सूक्ष्म अनुकूलन है।
लेकिन नियोजन तालिका पर एक स्मार्ट विचार क्या हो सकता है बाद में आसानी से उलटा पड़ सकता है:यदि - आपकी अपेक्षा से भिन्न - आप तालिका में 70000 पुस्तकों को संग्रहीत करना चाहते हैं, तो आप पाएंगे कि एक smallint
पर्याप्त नहीं होगा, भले ही आप नकारात्मक id
. की अनुमति दें एस। जब आपको प्राथमिक कुंजी के डेटा प्रकार को बदलना होगा और लाइव सिस्टम में इसे संदर्भित करने वाली सभी विदेशी कुंजियों को बदलना होगा, तो आपको चतुर अनुकूलन द्वारा लगभग 100 केबी बचाने से मिलने वाली किसी भी खुशी से कहीं अधिक दर्द होगा।