"कॉलम टेट्रिस"
दरअसल, आप कुछ कर सकते हैं , लेकिन इसके लिए गहरी समझ की जरूरत है। कीवर्ड है संरेखण पैडिंग . प्रत्येक डेटा प्रकार की विशिष्ट संरेखण आवश्यकताएं होती हैं।
आप स्तंभों के बीच pad पैडिंग में खोए हुए स्थान को कम कर सकते हैं उन्हें अनुकूल आदेश देकर। निम्नलिखित (चरम) उदाहरण बहुत अधिक भौतिक डिस्क स्थान को बर्बाद कर देगा:
CREATE TABLE t (
e int2 -- 6 bytes of padding after int2
, a int8
, f int2 -- 6 bytes of padding after int2
, b int8
, g int2 -- 6 bytes of padding after int2
, c int8
, h int2 -- 6 bytes of padding after int2
, d int8)
24 बाइट बचाने के लिए प्रति पंक्ति, इसके बजाय उपयोग करें:
CREATE TABLE t (
a int8
, b int8
, c int8
, d int8
, e int2
, f int2
, g int2
, h int2) -- 4 int2 occupy 8 byte (MAXALIGN), no padding at the end
db<>फिडल यहाँ
पुराना sqlfiddle
एक नियम के रूप में, यदि आप पहले 8-बाइट कॉलम रखते हैं, तो 4-बाइट्स, 2-बाइट्स और 1-बाइट कॉलम आखिरी में आप गलत नहीं हो सकते।
boolean
, uuid
(!) और कुछ अन्य प्रकारों को संरेखण पैडिंग की आवश्यकता नहीं है। text
, varchar
और अन्य "varlena" (चर लंबाई) प्रकार नाममात्र "इंट" संरेखण की आवश्यकता है (अधिकांश मशीनों पर 4 बाइट्स)। लेकिन मैंने डिस्क प्रारूप (रैम के विपरीत) में कोई संरेखण पैडिंग नहीं देखा। आखिरकार, मुझे स्रोत कोड में एक नोट में स्पष्टीकरण मिला:
यह भी ध्यान दें कि हम "पैक किए गए" varlenas को संग्रहीत करते समय नाममात्र संरेखण का उल्लंघन करने की अनुमति देते हैं; TOAST तंत्र इसे अधिकांश कोड से छिपाने का ध्यान रखता है।
तो "इंट" संरेखण केवल तभी लागू किया जाता है जब (संभावित रूप से संपीड़ित) डेटाम जिसमें एक अग्रणी लंबाई-बाइट 127 बाइट्स से अधिक हो। फिर varlena संग्रहण चार प्रमुख बाइट्स पर स्विच हो जाता है और "int" संरेखण की आवश्यकता होती है।
आम तौर पर, आप "column tetris" को बेहतर ढंग से चलाने पर प्रति पंक्ति कुछ बाइट बचा सकते हैं . ज्यादातर मामलों में इनमें से कोई भी आवश्यक नहीं है। लेकिन अरबों पंक्तियों के साथ इसका मतलब आसानी से एक-दो गीगाबाइट हो सकता है।
आप pg_column_size()
फंक्शन के साथ वास्तविक कॉलम/पंक्ति आकार का परीक्षण कर सकते हैं .
कुछ प्रकार डिस्क (संपीड़ित या "पैक" प्रारूप) की तुलना में RAM में अधिक स्थान घेरते हैं। pg_column_size()
के साथ समान मान (या मानों की पंक्ति बनाम तालिका पंक्ति) का परीक्षण करते समय आप तालिका स्तंभों की तुलना में स्थिरांक (RAM प्रारूप) के लिए बड़े परिणाम प्राप्त कर सकते हैं ।
अंत में, कुछ प्रकारों को संपीड़ित या "टोस्टेड" (लाइन से बाहर संग्रहीत) या दोनों किया जा सकता है।
ओवरहेड प्रति टपल (पंक्ति)
आइटम पहचानकर्ता के लिए प्रति पंक्ति 4 बाइट्स - उपरोक्त विचारों के अधीन नहीं।
और टपल हेडर के लिए कम से कम 24 बाइट्स (23 + पैडिंग)। डेटाबेस पेज लेआउट पर मैनुअल:
एक निश्चित आकार का हेडर होता है (अधिकांश मशीनों पर 23 बाइट्स पर कब्जा कर लेता है), उसके बाद एक वैकल्पिक नल बिटमैप, एक वैकल्पिक ऑब्जेक्ट आईडी फ़ील्ड और उपयोगकर्ता डेटा होता है।
हेडर और उपयोगकर्ता डेटा के बीच पैडिंग के लिए, आपको MAXALIGN
. जानना होगा आपके सर्वर पर - आमतौर पर 64-बिट OS पर 8 बाइट्स (या 32-बिट OS पर 4 बाइट्स)। यदि आप निश्चित नहीं हैं, तो pg_controldata
देखें ।
अपने पोस्टग्रेज बाइनरी डीआईआर . में निम्न को चलाएँ एक निश्चित उत्तर पाने के लिए:
./pg_controldata /path/to/my/dbcluster
मैनुअल:
<ब्लॉकक्वॉट>
वास्तविक उपयोगकर्ता डेटा (पंक्ति के कॉलम) t_hoff
द्वारा दर्शाए गए ऑफ़सेट से प्रारंभ होता है , जो हमेशा MAXALIGN
. का गुणज होना चाहिए मंच के लिए दूरी।
तो आप आमतौर पर 8 बाइट्स के गुणकों में डेटा पैक करके स्टोरेज इष्टतम प्राप्त करते हैं।
आपके द्वारा पोस्ट किए गए उदाहरण . में हासिल करने के लिए कुछ भी नहीं है . यह पहले से ही कसकर पैक किया गया है। पिछले int2
. के बाद पैडिंग के 2 बाइट , अंत में 4 बाइट्स। आप अंत में पैडिंग को 6 बाइट्स में समेकित कर सकते हैं, जो कुछ भी नहीं बदलेगा।
ओवरहेड प्रति डेटा पृष्ठ
डेटा पृष्ठ का आकार आमतौर पर 8 केबी होता है। इस स्तर पर कुछ ओवरहेड / ब्लोट भी:शेष इतना बड़ा नहीं है कि एक और टपल फिट हो सके, और अधिक महत्वपूर्ण रूप से मृत पंक्तियों या FILLFACTOR
के साथ आरक्षित प्रतिशत सेटिंग।
डिस्क पर आकार को ध्यान में रखने के लिए कुछ अन्य कारक हैं:
- हेरोकू पर मैं 5 एमबी पोस्टग्रेएसक्यूएल में कितने रिकॉर्ड स्टोर कर सकता हूं?
- क्या PostgreSQL में NULL का उपयोग अभी भी हेडर में NULL बिटमैप का उपयोग नहीं करता है?
- पढ़ने के प्रदर्शन के लिए PostgreSQL को कॉन्फ़िगर करना
सरणी प्रकार?
एक सरणी . के साथ टाइप करें जैसे आप मूल्यांकन कर रहे थे, आप 24 बाइट्स ओवरहेड जोड़ देंगे प्रकार के लिए। साथ ही, सरणी तत्व हमेशा की तरह स्थान घेरते हैं। वहां हासिल करने के लिए कुछ नहीं है।