यदि आप पोस्टग्रेज़ में बड़े डेटाबेस के साथ काम कर रहे हैं, तो यह कहानी परिचित लगेगी। जैसे-जैसे आपका पोस्टग्रेज डेटाबेस बढ़ता रहता है, आपका प्रदर्शन कम होने लगता है, और आपको भंडारण स्थान के बारे में चिंता होने लगती है - या, सटीक रूप से कहें तो, आप इसके लिए कितना भुगतान करेंगे। आपको PostgreSQL पसंद है, लेकिन कुछ ऐसा है जो आप चाहते हैं कि आपके पास होता: एक अत्यधिक प्रभावी डेटा संपीड़न तंत्र।
PostgreSQL में कुछ हद तक संपीड़न तंत्र है:
भले ही यह डेटासेट के आकार को कम कर सकता है, TOAST (ओवरसाइज़्ड एट्रीब्यूट स्टोरेज तकनीक) आपका पारंपरिक डेटा संपीड़न तंत्र नहीं है। यह समझने के लिए कि टोस्ट क्या है, हमें इसके बारे में बात करके शुरुआत करनी होगी
पोस्टग्रेज की भंडारण इकाइयों को पेज कहा जाता है, और इनका एक निश्चित आकार होता है (डिफ़ॉल्ट रूप से 8 केबी)। एक निश्चित पृष्ठ आकार होने से पोस्टग्रेज़ को कई फायदे मिलते हैं, जैसे कि इसकी डेटा प्रबंधन सरलता, दक्षता और स्थिरता, लेकिन यह एक नकारात्मक पहलू के साथ आता है: कुछ डेटा मान उस पृष्ठ में फिट नहीं हो सकते हैं।
यहीं पर TOAST आता है। TOAST उस स्वचालित तंत्र को संदर्भित करता है जिसका उपयोग PostgreSQL उन मानों को कुशलतापूर्वक संग्रहीत और प्रबंधित करने के लिए करता है जो Postgres में किसी पृष्ठ में फिट नहीं होते हैं। ऐसे मानों को संभालने के लिए, पोस्टग्रेज टोस्ट, डिफ़ॉल्ट रूप से, एक आंतरिक एल्गोरिदम का उपयोग करके उन्हें संपीड़ित करेगा। यदि, संपीड़न के बाद, मान अभी भी बहुत बड़े हैं, तो पोस्टग्रेज़ उन्हें मूल तालिका में पॉइंटर्स छोड़कर एक अलग तालिका (जिसे TOAST तालिका कहा जाता है) में ले जाएगा।
जैसा कि हम इस लेख में बाद में देखेंगे, आप वास्तव में एक उपयोगकर्ता के रूप में इस रणनीति को संशोधित कर सकते हैं, उदाहरण के लिए, किसी विशेष कॉलम में डेटा को संपीड़ित करने से बचने के लिए पोस्टग्रेज़ को बताकर।
जिन डेटा प्रकारों को TOAST के अधीन किया जा सकता है, वे मुख्य रूप से परिवर्तनीय-लंबाई वाले होते हैं जिनमें मानक PostgreSQL पृष्ठ की आकार सीमा को पार करने की क्षमता होती है। दूसरी ओर, निश्चित-लंबाई डेटा प्रकार, जैसे integer
, float
, या timestamp
, TOAST के अधीन नहीं हैं क्योंकि वे एक पृष्ठ के भीतर आराम से फिट होते हैं।
डेटा प्रकारों के कुछ उदाहरण जिन्हें टोस्ट के अधीन किया जा सकता है:
json
और jsonb
बड़े text
तार
varchar
और varchar(n)
(यदि varchar(n)
में निर्दिष्ट लंबाई काफी छोटी है, तो उस कॉलम का मान हमेशा TOAST सीमा से नीचे रह सकता है।)
bytea
बाइनरी डेटा संग्रहीत करता है
ज्यामितीय डेटा जैसे path
और polygon
और PostGIS प्रकार जैसे geometry
या geography
TOAST को समझना न केवल पृष्ठ आकार की अवधारणा से संबंधित है, बल्कि एक अन्य पोस्टग्रेज भंडारण अवधारणा से भी संबंधित है: टुपल्स। टुपल्स PostgreSQL तालिका में पंक्तियाँ हैं। आमतौर पर, TOAST तंत्र तब सक्रिय होता है जब टुपल के भीतर सभी फ़ील्ड का कुल आकार लगभग 2 kB से अधिक होता है।
यदि आप ध्यान दे रहे हैं, तो आप सोच रहे होंगे, "रुको, लेकिन पृष्ठ का आकार लगभग 8 kB है—यह ओवरहेड क्यों?" ऐसा इसलिए है क्योंकि PostgreSQL यह सुनिश्चित करना चाहता है कि वह एक ही पृष्ठ पर एकाधिक टुपल्स संग्रहीत कर सके: यदि टुपल्स बहुत बड़े हैं, तो प्रत्येक पृष्ठ पर कम टुपल्स फिट होते हैं, जिससे I/O संचालन में वृद्धि होती है और प्रदर्शन कम हो जाता है।
पोस्टग्रेज़ को अतिरिक्त परिचालन डेटा को फिट करने के लिए खाली स्थान रखने की भी आवश्यकता होती है: प्रत्येक पृष्ठ न केवल टपल डेटा को संग्रहीत करता है, बल्कि डेटा को प्रबंधित करने के लिए अतिरिक्त जानकारी, जैसे आइटम पहचानकर्ता, हेडर और लेनदेन की जानकारी भी संग्रहीत करता है।
इसलिए, जब टुपल में सभी फ़ील्ड का संयुक्त आकार लगभग 2 kB (या TOAST थ्रेशोल्ड पैरामीटर, जैसा कि हम बाद में देखेंगे) से अधिक हो जाता है, तो PostgreSQL यह सुनिश्चित करने के लिए कार्रवाई करता है कि डेटा कुशलतापूर्वक संग्रहीत है। टोस्ट इसे दो प्राथमिक तरीकों से संभालता है:
संपीड़न. PostgreSQL एक संपीड़न एल्गोरिथ्म का उपयोग करके उनके आकार को कम करने के लिए टुपल के भीतर बड़े फ़ील्ड मानों को संपीड़ित कर सकता है जिसे हम इस लेख में बाद में कवर करेंगे। डिफ़ॉल्ट रूप से, यदि संपीड़न टुपल के कुल आकार को सीमा से नीचे लाने के लिए पर्याप्त है, तो डेटा मुख्य तालिका में रहेगा, यद्यपि संपीड़ित प्रारूप में।
आउट-ऑफ-लाइन भंडारण. यदि अकेले संपीड़न बड़े फ़ील्ड मानों के आकार को कम करने के लिए पर्याप्त प्रभावी नहीं है, तो पोस्टग्रेज़ उन्हें एक अलग TOAST तालिका में ले जाता है। इस प्रक्रिया को "आउट-ऑफ-लाइन" स्टोरेज के रूप में जाना जाता है क्योंकि मुख्य तालिका में मूल टपल अब बड़े फ़ील्ड मान नहीं रखता है। इसके बजाय, इसमें एक "पॉइंटर" या TOAST तालिका में बड़े डेटा के स्थान का संदर्भ शामिल है।
हम इस लेख के लिए चीजों को थोड़ा सरल बना रहे हैं-
pglz
हमने उल्लेख किया है कि TOAST PostgreSQL में बड़े मानों को संपीड़ित कर सकता है। लेकिन PostgreSQL किस संपीड़न एल्गोरिथ्म का उपयोग कर रहा है, और यह कितना प्रभावी है?
pglz
(PostgreSQL Lempel-Ziv) डिफ़ॉल्ट आंतरिक संपीड़न एल्गोरिदम है जिसका उपयोग PostgreSQL द्वारा विशेष रूप से TOAST के लिए तैयार किया गया है।
यहां बताया गया है कि यह बहुत ही सरल शब्दों में कैसे काम करता है:
pglz
बार-बार डेटा से बचने का प्रयास करता है। जब यह बार-बार डेटा देखता है, तो एक ही चीज़ को दोबारा लिखने के बजाय, यह केवल वहीं इंगित करता है जहां उसने इसे पहले लिखा था। यह "दोहराव से बचना" जगह बचाने में मदद करता है।
जैसे ही pglz
डेटा पढ़ता है, उसे हाल ही में देखे गए कुछ डेटा याद हो जाते हैं। इस हालिया मेमोरी को "स्लाइडिंग विंडो" कहा जाता है।
जैसे ही नया डेटा आता है, pglz
जाँचता है कि क्या उसने यह डेटा हाल ही में (अपनी स्लाइडिंग विंडो के भीतर) देखा है। यदि हां, तो यह डेटा को दोहराने के बजाय एक संक्षिप्त संदर्भ लिखता है।
यदि डेटा नया है या वास्तविक डेटा से छोटा संदर्भ बनाने के लिए पर्याप्त बार दोहराया नहीं गया है, pglz
इसे वैसे ही लिख देता है जैसे यह है।
जब संपीड़ित डेटा को पढ़ने का समय आता है, pglz
मूल डेटा लाने के लिए अपने संदर्भों का उपयोग करता है। यह प्रक्रिया काफी सीधी है, क्योंकि यह संदर्भित डेटा को देखती है और उसे वहीं रखती है जहां वह है।
pglz
अपनी मेमोरी (स्लाइडिंग विंडो) के लिए अलग स्टोरेज की आवश्यकता नहीं है; यह कंप्रेस करते समय इसे बनाता है और डीकंप्रेस करते समय भी ऐसा ही करता है।
यह कार्यान्वयन TOAST तंत्र के भीतर संपीड़न दक्षता और गति के बीच संतुलन प्रदान करने के लिए डिज़ाइन किया गया है। संपीड़न दर के संदर्भ में, pglz
की प्रभावशीलता काफी हद तक डेटा की प्रकृति पर निर्भर करेगी।
उदाहरण के लिए, अत्यधिक दोहराव वाला डेटा उच्च एन्ट्रापी डेटा (जैसे यादृच्छिक डेटा) की तुलना में बहुत बेहतर तरीके से संपीड़ित होगा। आप 25 से 50 प्रतिशत की सीमा में संपीड़न अनुपात देख सकते हैं, लेकिन यह एक बहुत ही सामान्य अनुमान है - परिणाम डेटा की सटीक प्रकृति के आधार पर व्यापक रूप से भिन्न होंगे।
डिफ़ॉल्ट रूप से, PostgreSQL पहले बताई गई प्रक्रिया के अनुसार TOAST तंत्र से गुजरेगा (यदि संपीड़न पर्याप्त नहीं है तो पहले संपीड़न और उसके बाद आउट-ऑफ-लाइन स्टोरेज)। फिर भी, ऐसे परिदृश्य हो सकते हैं जहां आप प्रति-कॉलम के आधार पर इस व्यवहार को ठीक करना चाहेंगे। PostgreSQL आपको TOAST रणनीतियों PLAIN
, EXTERNAL
, EXTENDED
, और MAIN
का उपयोग करके ऐसा करने की अनुमति देता है।
EXTENDED
: यह डिफ़ॉल्ट रणनीति है. इसका तात्पर्य यह है कि यदि डेटा नियमित तालिका पृष्ठ के लिए बहुत बड़ा है तो उसे एक अलग TOAST तालिका में लाइन से बाहर संग्रहीत किया जाएगा। डेटा को TOAST तालिका में ले जाने से पहले, स्थान बचाने के लिए इसे संपीड़ित किया जाएगा।
EXTERNAL
: यह रणनीति PostgreSQL को इस कॉलम के लिए डेटा को लाइन से बाहर संग्रहीत करने के लिए कहती है यदि डेटा नियमित तालिका पृष्ठ में फिट होने के लिए बहुत बड़ा है, और हम PostgreSQL से डेटा को संपीड़ित न करने के लिए कह रहे हैं - मान बस ले जाया जाएगा टोस्ट टेबल यथावत।
MAIN
: यह रणनीति बीच का रास्ता है। यह संपीड़न के माध्यम से डेटा को मुख्य तालिका में पंक्ति में रखने का प्रयास करता है; यदि डेटा निश्चित रूप से बहुत बड़ा है, तो यह त्रुटि से बचने के लिए डेटा को TOAST तालिका में ले जाएगा, लेकिन PostgreSQL संपीड़ित डेटा को स्थानांतरित नहीं करेगा। इसके बजाय, यह मान को उसके मूल रूप में TOAST तालिका में संग्रहीत करेगा।
PLAIN
: किसी कॉलम में PLAIN
उपयोग करने से PostgreSQL को कॉलम के डेटा को हमेशा मुख्य तालिका में लाइन में संग्रहीत करने के लिए कहा जाता है, यह सुनिश्चित करते हुए कि इसे आउट-ऑफ़-लाइन TOAST तालिका में नहीं ले जाया जाता है। ध्यान रखें कि यदि डेटा पृष्ठ आकार से अधिक बढ़ता है, तो INSERT
विफल हो जाएगा क्योंकि डेटा फिट नहीं होगा।
यदि आप किसी विशेष तालिका की वर्तमान रणनीतियों का निरीक्षण करना चाहते हैं, तो आप निम्नलिखित चला सकते हैं:
\d+ your_table_name
आपको इस तरह एक आउटपुट मिलेगा:
=> \d+ example_table Table "public.example_table" Column | Data Type | Modifiers | Storage | Stats target | Description ---------+------------------+-----------+----------+--------------+------------- bar | varchar(100000) | | extended | |
यदि आप स्टोरेज सेटिंग को संशोधित करना चाहते हैं, तो आप निम्न कमांड का उपयोग करके ऐसा कर सकते हैं:
-- Sets EXTENDED as the TOAST strategy for bar_column ALTER TABLE example_blob ALTER COLUMN bar_column SET STORAGE EXTENDED;
उपरोक्त रणनीतियों के अलावा, ये दो पैरामीटर भी TOAST व्यवहार को नियंत्रित करने के लिए महत्वपूर्ण हैं:
TOAST_TUPLE_THRESHOLD
यह वह पैरामीटर है जो बड़े आकार के टुपल्स के लिए टोस्टिंग ऑपरेशन (संपीड़न और आउट-ऑफ-लाइन स्टोरेज) पर विचार करते समय आकार सीमा निर्धारित करता है।
जैसा कि हमने पहले बताया है, डिफ़ॉल्ट रूप से, TOAST_TUPLE_THRESHOLD
लगभग 2 kB पर सेट होता है।
TOAST_COMPRESSION_THRESHOLD
यह वह पैरामीटर है जो किसी मान के न्यूनतम आकार को निर्दिष्ट करता है इससे पहले कि पोस्टग्रेज टोस्टिंग प्रक्रिया के दौरान इसे संपीड़ित करने पर विचार करे।
यदि कोई मान इस सीमा से अधिक है, तो PostgreSQL उसे संपीड़ित करने का प्रयास करेगा। हालाँकि, सिर्फ इसलिए कि कोई मान संपीड़न सीमा से ऊपर है, इसका मतलब यह नहीं है कि यह स्वचालित रूप से संपीड़ित होगा: TOAST रणनीतियाँ PostgreSQL को मार्गदर्शन करेंगी कि डेटा को कैसे संभालना है, यह इस आधार पर होगा कि यह संपीड़ित था या नहीं और इसके परिणामी आकार टुपल के सापेक्ष हैं और पृष्ठ सीमाएँ, जैसा कि हम अगले भाग में देखेंगे।
TOAST_TUPLE_THRESHOLD
ट्रिगर बिंदु है। जब टुपल के डेटा फ़ील्ड का आकार संयुक्त रूप से इस सीमा से अधिक हो जाता है, तो PostgreSQL संपीड़न और आउट-ऑफ़-लाइन स्टोरेज पर विचार करते हुए, अपने कॉलम के लिए सेट TOAST रणनीति के आधार पर इसका प्रबंधन करने का मूल्यांकन करेगा। की गई सटीक कार्रवाइयां इस बात पर भी निर्भर करेंगी कि कॉलम डेटा TOAST_COMPRESSION_THRESHOLD
से अधिक है या नहीं:
EXTENDED
(डिफ़ॉल्ट रणनीति): यदि टुपल का आकार TOAST_TUPLE_THRESHOLD
से अधिक है, तो PostgreSQL पहले बड़े कॉलमों को संपीड़ित करने का प्रयास करेगा यदि वे TOAST_COMPRESSION_THRESHOLD
से भी अधिक हैं। यदि संपीड़न टपल आकार को सीमा के नीचे लाता है, तो यह मुख्य तालिका में रहेगा। यदि ऐसा नहीं होता है, तो डेटा को आउट-ऑफ़-लाइन TOAST तालिका में ले जाया जाएगा, और मुख्य तालिका में इस बाहरी डेटा के संकेतक होंगे।
MAIN
: यदि टपल का आकार TOAST_TUPLE_THRESHOLD
से अधिक है, तो PostgreSQL बड़े आकार के कॉलमों को संपीड़ित करने का प्रयास करेगा (बशर्ते वे TOAST_COMPRESSION_THRESHOLD
से अधिक हों)। यदि संपीड़न टपल को मुख्य तालिका के टपल के भीतर फिट होने की अनुमति देता है, तो यह वहीं रहता है। यदि नहीं, तो डेटा को उसके असम्पीडित रूप में TOAST तालिका में ले जाया जाता है।
EXTERNAL
: TOAST_COMPRESSION_THRESHOLD
की परवाह किए बिना, PostgreSQL संपीड़न को छोड़ देता है। यदि टुपल का आकार TOAST_TUPLE_THRESHOLD
से अधिक है, तो बड़े आकार के कॉलम TOAST तालिका में आउट-ऑफ़-लाइन संग्रहीत किए जाएंगे।
PLAIN
: डेटा हमेशा मुख्य तालिका में संग्रहीत किया जाता है। यदि किसी टुपल का आकार पृष्ठ आकार से अधिक हो जाता है (बहुत बड़े कॉलम होने के कारण), तो एक त्रुटि उत्पन्न हो जाती है।
रणनीति | यदि टुपल हो तो संपीड़ित करें > TOAST_COMPRESSION_THRESHOLD | यदि टुपल > TOAST_TUPLE_THRESHOLD, तो आउट-ऑफ़-लाइन स्टोर करें | विवरण |
---|---|---|---|
विस्तारित | हाँ | हाँ | डिफ़ॉल्ट रणनीति. पहले संपीड़ित करता है, फिर जाँचता है कि आउट-ऑफ़-लाइन संग्रहण की आवश्यकता है या नहीं। |
मुख्य | हाँ | केवल असम्पीडित रूप में | पहले संपीड़ित करता है, और यदि अभी भी बड़ा है, तो संपीड़न के बिना टोस्ट तालिका में चला जाता है। |
बाहरी | नहीं | हाँ | अधिक आकार होने पर, बिना संपीड़न के, हमेशा टोस्ट में चला जाता है। |
मैदान | नहीं | नहीं | डेटा हमेशा मुख्य तालिका में रहता है. यदि कोई टुपल पृष्ठ आकार से अधिक हो जाता है, तो एक त्रुटि उत्पन्न होती है। |
अब तक, आप शायद समझ गए होंगे कि TOAST वह डेटा संपीड़न तंत्र क्यों नहीं है जो आप चाहते हैं कि आपके पास PostgreSQL में हो। आधुनिक एप्लिकेशन प्रतिदिन बड़ी मात्रा में डेटा ग्रहण करते हैं, जिसका अर्थ है कि डेटाबेस तेजी से बढ़ते हैं।
जब हमारे प्रिय पोस्टग्रेज़ को दशकों पहले बनाया गया था तब ऐसी समस्या उतनी प्रमुख नहीं थी, लेकिन आज के डेवलपर्स को अपने डेटासेट के स्टोरेज फ़ुटप्रिंट को कम करने के लिए संपीड़न समाधान की आवश्यकता है।
जबकि TOAST अपनी तकनीकों में से एक के रूप में संपीड़न को शामिल करता है, यह समझना महत्वपूर्ण है कि इसकी प्राथमिक भूमिका पारंपरिक अर्थों में डेटाबेस संपीड़न तंत्र के रूप में काम करना नहीं है। TOAST मुख्य रूप से एक समस्या का समाधान है: पोस्टग्रेज पेज की संरचनात्मक सीमाओं के भीतर बड़े मूल्यों का प्रबंधन करना।
हालांकि यह दृष्टिकोण विशिष्ट बड़े मूल्यों के संपीड़न के कारण कुछ भंडारण स्थान की बचत कर सकता है, लेकिन इसका प्राथमिक उद्देश्य पूरे बोर्ड में भंडारण स्थान को अनुकूलित करना नहीं है।
उदाहरण के लिए, यदि आपके पास छोटे टुपल्स से बना 5 टीबी डेटाबेस है, तो TOAST आपको उन 5 टीबी को 1 टीबी में बदलने में मदद नहीं करेगा। हालाँकि TOAST के भीतर ऐसे पैरामीटर हैं जिन्हें समायोजित किया जा सकता है, यह TOAST को सामान्यीकृत भंडारण-बचत समाधान में नहीं बदलेगा।
और PostgreSQL में पारंपरिक संपीड़न तंत्र के रूप में TOAST का उपयोग करने में अन्य अंतर्निहित समस्याएं हैं, उदाहरण के लिए:
TOASTed डेटा तक पहुंचने से ओवरहेड बढ़ सकता है, खासकर जब डेटा लाइन से बाहर संग्रहीत होता है। यह तब और अधिक स्पष्ट हो जाता है जब कई बड़े टेक्स्ट या अन्य टोस्ट-सक्षम डेटा प्रकारों तक अक्सर पहुंच बनाई जाती है।
TOAST में संपीड़न नीतियों को निर्धारित करने के लिए उच्च-स्तरीय, उपयोगकर्ता-अनुकूल तंत्र का अभाव है। इसे भंडारण लागत को अनुकूलित करने या भंडारण प्रबंधन की सुविधा के लिए नहीं बनाया गया है।
TOAST का संपीड़न विशेष रूप से उच्च संपीड़न अनुपात प्रदान करने के लिए डिज़ाइन नहीं किया गया है। यह केवल एक एल्गोरिदम ( pglz
) का उपयोग करता है, जिसमें संपीड़न दर आमतौर पर 25-50 प्रतिशत से भिन्न होती है।
अपनी बड़ी तालिकाओं में एक संपीड़न नीति जोड़कर,
समय-आधारित संपीड़न नीति को परिभाषित करके, आप इंगित करते हैं कि डेटा को कब संपीड़ित किया जाना चाहिए। उदाहरण के लिए, आप सात (7) दिनों से अधिक पुराने डेटा को स्वचालित रूप से संपीड़ित करना चुन सकते हैं:
-- Compress data older than 7 days SELECT add_compression_policy('my_hypertable', INTERVAL '7 days');
इस संपीड़न नीति के माध्यम से, टाइमस्केल तालिका को बदल देगा
फ़्लोट्स के लिए गोरिल्ला संपीड़न
डेल्टा-ऑफ़-डेल्टा +
कुछ दोहराए जाने वाले मानों वाले स्तंभों के लिए संपूर्ण-पंक्ति शब्दकोश संपीड़न (+ शीर्ष पर LZ संपीड़न)
अन्य सभी प्रकारों के लिए एलजेड-आधारित सरणी संपीड़न
यह स्तंभ संपीड़न डिज़ाइन PostgreSQL में बड़े डेटासेट की समस्या का एक कुशल और स्केलेबल समाधान प्रदान करता है। यह आपको आपके क्वेरी प्रदर्शन को नुकसान पहुंचाए बिना अधिक डेटा संग्रहीत करने के लिए कम संग्रहण का उपयोग करने की अनुमति देता है (यह इसे बेहतर बनाता है)। और TimescaleDB के नवीनतम संस्करणों में, आप संपीड़ित डेटा पर सीधे INSERT
, DELETE
और UPDATE
भी कर सकते हैं।
हमें उम्मीद है कि इस लेख ने आपको यह समझने में मदद की है कि हालांकि TOAST एक PostgreSQL पेज के भीतर बड़े मूल्यों को प्रबंधित करने के लिए एक सुविचारित तंत्र है, लेकिन यह आधुनिक अनुप्रयोगों के दायरे में डेटाबेस भंडारण उपयोग को अनुकूलित करने के लिए प्रभावी नहीं है।
यदि आप प्रभावी डेटा संपीड़न की तलाश में हैं जो आपके भंडारण बचत पर सुई को स्थानांतरित कर सकता है, तो टाइमस्केल को आज़माएं। आप हमारे क्लाउड प्लेटफ़ॉर्म को आज़मा सकते हैं जो PostgreSQL को नई प्रदर्शन ऊंचाइयों तक ले जाता है, जिससे यह तेज़ और उग्र हो जाता है-
कार्लोटा सोटो द्वारा लिखित।