हम पुराने डेटा को कुशलतापूर्वक समाप्त करने के लिए अपने प्राथमिक PostgreSQL डेटाबेस में विभाजित तालिकाओं का उपयोग करते हैं, क्योंकि एक विशाल तालिका से डेटा के एक समूह को हटाने से डेटाबेस का प्रदर्शन प्रभावित हो सकता है। संस्करण 10 से पहले, PostgreSQL के पास विभाजित तालिकाओं के लिए मूल समर्थन नहीं था, इसलिए हमने विभाजन को लागू करने के लिए pg_partman एक्सटेंशन का उपयोग किया। यह तालिका के चाइल्ड टेबल बनाने के लिए PostgreSQL की टेबल इनहेरिटेंस का उपयोग करके काम करता है जिसे विभाजित किया जाना है और पैरेंट टेबल के बजाय चाइल्ड टेबल में डेटा डालने के लिए ट्रिगर करता है। उस एक्सटेंशन ने हमारे लिए अच्छा काम किया है, लेकिन इसका एक नकारात्मक पहलू है - जब आप Amazon RDS का उपयोग कर रहे हों तो यह एक विकल्प नहीं है, क्योंकि यह समर्थित नहीं है। अब जबकि PostgreSQL के पास मूल विभाजन के लिए समर्थन है, मुझे लगा कि अब उस एक्सटेंशन को छोड़ने का समय आ गया है, इसलिए हमारे पास RDS का उपयोग करने का विकल्प होगा।
हमारा विभाजन उपयोग-मामला काफी सरल है:हम समय के आधार पर तालिकाओं का विभाजन करते हैं, हर दिन, सप्ताह या महीने के लिए एक नया विभाजन बनाते हैं, यह इस बात पर निर्भर करता है कि हम सभी विभाजनों में कितनी पंक्तियों को संग्रहीत करना चाहते हैं और हम कितने समय तक बनाए रखना चाहते हैं। जानकारी। हमारी सभी विभाजित तालिकाओं में एक created_at
है कॉलम जिसका उपयोग यह निर्धारित करने के लिए किया जाएगा कि कौन सा विभाजन प्रत्येक पंक्ति को संग्रहीत करता है। उदाहरण के लिए, हमारे पास इस तरह परिभाषित एक तालिका हो सकती है:
create table events (
project_id integer,
data jsonb,
created_at timestamp
)
partition by range (created_at);
और अगर हम साप्ताहिक विभाजन करना चाहते हैं, तो वे इस तरह दिखेंगे:
('2019-10-28') से ('2019-11-04') तक के मानों के लिएcreate table events_p2019_10_28 partition of events for values from ('2019-10-28') to ('2019-11-04');
create table events_p2019_11_04 partition of events for values from ('2019-11-04') to ('2019-11-11');
समय-आधारित विभाजन योजना के साथ, पुराने डेटा को हटाना उतना ही सरल है जितना कि किसी एक विभाजन को छोड़ना। फिर, हमें जो नियमित रखरखाव करने की आवश्यकता होती है, वह है दिनांक सीमाओं के लिए नए विभाजन बनाना जैसे-जैसे हम उनसे संपर्क करते हैं और पुराने विभाजनों को हटाते हैं जिनमें वह डेटा होता है जिसे हम अब नहीं चाहते हैं। उस रखरखाव को थोड़ा आसान बनाने के लिए, मैंने pg_partition_manager रत्न बनाया है। स्वाभाविक रूप से, यह pg_partman एक्सटेंशन के साथ मेरे अनुभव से प्रेरित है, जिसने हमारी बहुत अच्छी सेवा की है।
ऊपर वर्णित घटना तालिका और विभाजन योजना को देखते हुए, आइए देखें कि आप इस रत्न का उपयोग कैसे करेंगे। आप एक स्क्रिप्ट या रेक कार्य तैयार करेंगे जो इस तरह दिखता है:
require "pg_partition_manager"
PgPartitionManager::Time.process([{parent_table: "public.events", period: "week", premake: 1, retain: 3}])
parent_table
schema.table_name
. के रूप में परिभाषित किया गया है (public
, डिफ़ॉल्ट स्कीमा, अक्सर केवल एक रेल डेवलपर्स का उपयोग समाप्त होता है)। period
दिन, सप्ताह या महीना हो सकता है। premake
. के साथ आप चुन सकते हैं कि आप पहले से कितनी टेबल बनाना चाहते हैं (वर्तमान अवधि के बाद) , और retain
. के साथ आप कितनी टेबल (वर्तमान अवधि से पहले) रखना चाहते हैं . यदि आप premake
. निर्दिष्ट नहीं करते हैं, तो मणि 4 तालिकाओं को पूर्व-निर्मित करने के लिए डिफ़ॉल्ट है , और यदि आप retain
निर्दिष्ट नहीं करते हैं, तो यह डिफ़ॉल्ट रूप से 7 दिन, 4 सप्ताह और 6 महीने के लिए डेटा बनाए रखता है ।
दैनिक क्रॉन जॉब के साथ उस स्क्रिप्ट/कार्य को आमंत्रित करें, और आप पूरी तरह तैयार हैं - यह आवश्यकतानुसार टेबल बनाएगा और छोड़ देगा।
सभी ActiveRecord प्रश्न ठीक वैसे ही कार्य करते हैं जैसे वे एक गैर-विभाजित तालिका के साथ करते हैं, इसलिए आपको अपने कोड में कुछ भी बदलने की आवश्यकता नहीं है। यानी Event.create
, Event.where
, आदि, हमेशा की तरह काम करेंगे, जब आप इसे सम्मिलित करते हैं तो PostgreSQL डेटा को आपके लिए सही विभाजन में रखता है। यदि आपके पास बहुत अधिक डेटा है, तो आप एक बदलाव देख सकते हैं, हालांकि... जब आप created_at
शामिल करते हैं आपके प्रश्नों में, PostgreSQL को सभी विभाजनों को स्कैन नहीं करना होगा -- केवल वे विभाजन जो आपके द्वारा अपने खंड में निर्दिष्ट सीमा को कवर करते हैं।
संक्षेप में, यदि आपके पास बहुत अधिक समय-आधारित डेटा है जिसे आप समाप्त होने पर हटाना चाहते हैं, तो अपने ऐप को खुश करने के लिए PostgreSQL विभाजन तालिका और pg_partition_manager रत्न का उपयोग करें। :)