पंक्ति आकार की गणना उससे कहीं अधिक जटिल है।
संग्रहण को आमतौर पर 8 kB डेटा पृष्ठों . में विभाजित किया जाता है . प्रति पृष्ठ एक छोटा निश्चित ओवरहेड होता है, संभावित शेष इतने बड़े नहीं होते हैं कि एक और टपल फिट हो सकें, और अधिक महत्वपूर्ण रूप से मृत पंक्तियाँ या प्रतिशत शुरू में FILLFACTOR
के साथ आरक्षित हैं। सेटिंग।
और और भी अधिक ओवरहेड है प्रति पंक्ति (टुपल):पृष्ठ के प्रारंभ में 4 बाइट्स का एक आइटम पहचानकर्ता, HeapTupleHeader
23 बाइट्स और संरेखण पैडिंग . टपल हेडर की शुरुआत और साथ ही टपल डेटा की शुरुआत MAXALIGN
के गुणक में संरेखित होती है , जो एक विशिष्ट 64-बिट मशीन पर 8 बाइट्स है। कुछ डेटा प्रकारों को 2, 4 या 8 बाइट्स के अगले गुणक में संरेखण की आवश्यकता होती है।
सिस्टम टेबल पर मैनुअल को उद्धृत करना pg_tpye
:
typalign
इस प्रकार के मान को संग्रहीत करते समय आवश्यक संरेखण है। यह डिस्क पर भंडारण के साथ-साथ PostgreSQL के अंदर मूल्य के अधिकांश अभ्यावेदन पर लागू होता है। जब एक से अधिक मान लगातार संग्रहीत किए जाते हैं, जैसे कि डिस्क पर एक पूर्ण पंक्ति के प्रतिनिधित्व में, इस प्रकार के डेटा से पहले पैडिंग डाली जाती है ताकि यह निर्दिष्ट सीमा पर शुरू हो। संरेखण संदर्भ अनुक्रम में पहले डेटा की शुरुआत है।
संभावित मान हैं:
-
c
=char
संरेखण, यानी, किसी संरेखण की आवश्यकता नहीं है। -
s
=short
संरेखण (अधिकांश मशीनों पर 2 बाइट्स)। -
i
=int
संरेखण (अधिकांश मशीनों पर 4 बाइट्स)। -
d
=double
संरेखण (कई मशीनों पर 8 बाइट्स, लेकिन किसी भी तरह से नहीं)।
मैनुअल में बुनियादी बातों के बारे में यहां पढ़ें।
आपका उदाहरण
यह आपके 3 integer
. के बाद 4 बाइट पैडिंग में परिणत होता है कॉलम, क्योंकि timestamp
कॉलम के लिए double
की आवश्यकता है संरेखण और 8 बाइट्स के अगले गुणक पर प्रारंभ करने की आवश्यकता है।
तो, एक पंक्ति में है:
23 -- heaptupleheader
+ 1 -- padding or NULL bitmap
+ 12 -- 3 * integer (no alignment padding here)
+ 4 -- padding after 3rd integer
+ 8 -- timestamp
+ 0 -- no padding since tuple ends at multiple of MAXALIGN
प्लस आइटम आइडेंटिफ़ायर प्रति टुपल पेज हेडर में (जैसा कि टिप्पणी में @A.H. द्वारा बताया गया है):
+ 4 -- item identifier in page header
------
= 52 bytes
तो हम देखे गए 52 बाइट्स . पर पहुंचते हैं ।
गणना pg_relation_size(tbl) / count(*)
निराशावादी अनुमान है। pg_relation_size(tbl)
ब्लोट (मृत पंक्तियाँ) और fillfactor
. द्वारा आरक्षित स्थान शामिल हैं , साथ ही प्रति डेटा पृष्ठ और प्रति तालिका ओवरहेड। (और हमने लंबे समय तक संपीड़न का उल्लेख भी नहीं किया varlena
TOAST तालिकाओं में डेटा, क्योंकि यह यहां लागू नहीं होता है।)
आप अतिरिक्त मॉड्यूल pgstattuple स्थापित कर सकते हैं और SELECT * FROM pgstattuple('tbl_name');
से कॉल कर सकते हैं टेबल और टपल साइज के बारे में अधिक जानकारी के लिए।
संबंधित:
- पृष्ठ लेआउट के साथ तालिका का आकार
- PostgreSQL में स्थान की गणना और बचत करना