OS पर स्थान लौटने के लिए, उपयोग करें VACUUM FULL
। इस पर रहते हुए, मुझे लगता है कि आप चलाते हैं VACUUM FULL ANALYZE
। मैं मैनुअल को उद्धृत करता हूं :
FULL
"पूर्ण" वैक्यूम का चयन करता है, जो अधिक स्थान को पुनः प्राप्त कर सकता है , लेकिन अधिक समय लेता है और विशेष रूप से तालिका को लॉक करता है। इस विधि को अतिरिक्त डिस्क स्थान की भी आवश्यकता होती है, क्योंकि यह तालिका की एक नई प्रति लिखता है और जब तक ऑपरेशन पूरा नहीं होता तब तक पुरानी प्रति जारी नहीं करता है। आमतौर पर इसका उपयोग केवल तब किया जाना चाहिए जब तालिका के भीतर से एक महत्वपूर्ण मात्रा में जगह की आवश्यकता हो।
बोल्ड जोर मेरा।
CLUSTER
एक संपार्श्विक प्रभाव के रूप में, वह भी प्राप्त करता है।
सादा VACUUM
आमतौर पर आपके लक्ष्य को प्राप्त नहीं करता है ( "तालिका के अंत में एक या एक से अधिक पृष्ठ पूरी तरह से स्वतंत्र हैं" )। यह पंक्तियों को पुन: व्यवस्थित नहीं करता है और केवल अवसर आने पर फ़ाइल के भौतिक छोर से खाली पृष्ठों को प्रूव करता है - जैसे मैनुअल से आपका उद्धरण।
जब आप INSERT
पंक्तियों का एक समूह और DELETE
अन्य ट्यूपल्स संलग्न होने से पहले आप भौतिक फ़ाइल के अंत में खाली पृष्ठ प्राप्त कर सकते हैं । या यह संयोग से हो सकता है यदि पर्याप्त पंक्तियों को हटा दिया जाए।
वहाँ भी विशेष सेटिंग्स है कि VACUUM FULL
स्थान को पुनः प्राप्त करने से रोक सकते हैं। देख:
परीक्षण के लिए एक तालिका के अंत में खाली पृष्ठ तैयार करें
सिस्टम कॉलम ctid
एक पंक्ति की भौतिक स्थिति का प्रतिनिधित्व करता है। आपको उस कॉलम को समझने की आवश्यकता है:
हम उसके साथ काम कर सकते हैं और पिछले पृष्ठ से सभी पंक्तियों को हटाकर एक तालिका तैयार कर सकते हैं:
DELETE FROM tbl t
USING (
SELECT (split_part(ctid::text, ',', 1) || ',0)')::tid AS min_tid
, (split_part(ctid::text, ',', 1) || ',65535)')::tid AS max_tid
FROM tbl
ORDER BY ctid DESC
LIMIT 1
) d
WHERE t.ctid BETWEEN d.min_tid AND d.max_tid;
अब, अंतिम पृष्ठ खाली है। यह समवर्ती लेखन को नजरअंदाज करता है। या तो आप उस टेबल पर केवल एक ही लेखन कर रहे हैं या आपको हस्तक्षेप से बचने के लिए राइट लॉक लेने की आवश्यकता है।
क्वॉलिफाइंग पंक्तियों को जल्दी पहचानने के लिए क्वेरी को ऑप्टिमाइज़ किया गया है। एक की दूसरी संख्या tid
tuple सूचकांक अहस्ताक्षरित के रूप में संग्रहीत है int2
, और 65535
उस प्रकार ( 2^16 - 1
) के लिए अधिकतम है , इसलिए यह सुरक्षित ऊपरी सीमा है।
एसक्यूएल फिडल (एक अलग मामले से एक साधारण तालिका का पुन: उपयोग करना।)
पंक्ति / तालिका आकार मापने के लिए उपकरण:
भरी हुई डिस्क
आपको इनमें से किसी भी ऑपरेशन के लिए डिस्क पर विग्लिंग रूम की आवश्यकता है। / के pg_repack
प्रतिस्थापन के रूप में सामुदायिक उपकरण भी है । यह विशेष ताले से बचता है, लेकिन साथ ही साथ काम करने के लिए मुफ्त स्थान की आवश्यकता होती है। नियम पुस्तिका:VACUUM FULL
CLUSTER
लक्ष्य तालिका (ओं) और अनुक्रमित के रूप में बड़े रूप में दो बार मुक्त डिस्क स्थान की आवश्यकता होती है।
अंतिम उपाय के रूप में, आप एक डंप / रिस्टोर साइकिल चला सकते हैं। टेबल और इंडेक्स से भी सभी ब्लोट को हटा देता है। बारीकी से संबंधित प्रश्न:
वहाँ पर जवाब बहुत कट्टरपंथी है। यदि आपकी स्थिति इसके लिए अनुमति देती है (पंक्ति हटाने को रोकने के लिए कोई विदेशी कुंजी या अन्य संदर्भ नहीं), और तालिका में कोई समवर्ती पहुँच नहीं है), तो आप बस यह कर सकते हैं:
एक से जोड़ने डिस्क के लिए तालिका डंप दूरस्थ कंप्यूटर के साथ डिस्क स्थान के बहुत सारे ( -a
के लिए --data-only
):
दूरस्थ शेल से, डंप टेबल डेटा:
pg_dump -h <host_name> -p <port> -t mytbl -a mydb > db_mytbl.sql
पीजी सत्र में, TRUNCATE
तालिका:
-- drop all indexes and constraints here for best performance
TRUNCATE mytbl;
दूरस्थ शेल से, उसी तालिका में पुनर्स्थापित करें:
psql -h <host_name> -p <port> mydb -f db_mytbl.sql
-- recreate all indexes and constraints here
यह अब किसी भी मृत पंक्तियों या ब्लोट से मुक्त है।
लेकिन शायद तुम उस सरल हो सकता है?
क्या आप असंबंधित फ़ाइलों को हटाकर (चलती) डिस्क पर पर्याप्त स्थान बना सकते हैं?
क्या आप VACUUM FULL
पहले एक-एक करके छोटे टेबल बना सकते हैं , जिससे पर्याप्त डिस्क स्पेस खाली हो जाएगा?
क्या आप फूले हुए इंडेक्स से डिस्क स्थान को चला सकते हैं REINDEX TABLE
या REINDEX INDEX
मुक्त कर सकते हैं ?
जो कुछ भी आप करते हैं, दाने मत बनो । यदि संदेह है, तो पहले सब कुछ एक सुरक्षित स्थान पर बैकअप करें।