संक्षिप्त उत्तर यह है कि डेटाबेस संग्रहण स्थान की तुलना में गति के लिए अधिक अनुकूलित है।
उदाहरण के लिए, यदि आपने किसी तालिका में 100 पंक्तियाँ डाली हैं, फिर एक विषम संख्या वाली आईडी के साथ प्रत्येक पंक्ति को हटा दिया है, तो DBMS केवल 50 पंक्तियों के साथ एक नई तालिका लिख सकता है, लेकिन इसके लिए केवल हटाई गई पंक्तियों को खाली स्थान के रूप में चिह्नित करना अधिक कुशल है। और जब आप अगली पंक्ति डालें तो उनका पुन:उपयोग करें। इसलिए तालिका वर्तमान में जितनी जगह चाहिए उससे दोगुनी जगह लेती है।
लेन-देन प्रबंधन के लिए लॉक करने के बजाय "एमवीसीसी" के पोस्टग्रेज का उपयोग इसकी और भी अधिक संभावना बनाता है, क्योंकि अद्यतन में आमतौर पर भंडारण के लिए एक नई पंक्ति लिखना शामिल होता है, फिर पुरानी पंक्ति को हटा दिया जाता है जब कोई लेनदेन इसे नहीं देख रहा हो।
डेटाबेस को डंप और पुनर्स्थापित करके, आप इस खाली स्थान के बिना एक डीबी को फिर से बना रहे हैं। यह अनिवार्य रूप से VACUUM FULL
है कमांड करता है - यह वर्तमान डेटा को एक नई फ़ाइल में फिर से लिखता है, फिर पुरानी फ़ाइल को हटा देता है।
एक एक्सटेंशन पोस्टग्रेज के साथ वितरित किया गया है जिसे pg_freespace
कहा जाता है।
जो आपको इसमें से कुछ की जांच करने देता है। जैसे आप मुख्य तालिका आकार (अलग-अलग "TOAST" तालिकाओं में संग्रहीत अनुक्रमणिका और स्तंभों को शामिल नहीं करते) और प्रत्येक तालिका द्वारा उपयोग की जाने वाली खाली जगह को नीचे सूचीबद्ध कर सकते हैं:
Select oid::regclass::varchar as table,
pg_size_pretty(pg_relation_size(oid)/1024 * 1024) As size,
pg_size_pretty(sum(free)) As free
From (
Select c.oid,
(pg_freespace(c.oid)).avail As free
From pg_class c
Join pg_namespace n on n.oid = c.relnamespace
Where c.relkind = 'r'
And n.nspname Not In ('information_schema', 'pg_catalog')
) tbl
Group By oid
Order By pg_relation_size(oid) Desc, sum(free) Desc;