PostgreSQL के संस्करण 10 में घोषणात्मक तालिका विभाजन जोड़ा गया है सुविधा। संस्करण 11 (वर्तमान में बीटा में) में, आप इसे विदेशी डेटावापर्स के साथ जोड़ सकते हैं , एकाधिक पोस्टग्रेएसक्यूएल सर्वरों पर आपकी टेबल को मूल रूप से शार्प करने के लिए एक तंत्र प्रदान करता है।
घोषणात्मक विभाजन
एक तालिका पर विचार करें जो प्रत्येक दिन के लिए शहरों के दैनिक न्यूनतम और अधिकतम तापमान को संग्रहीत करती है:
CREATE TABLE temperatures (
at date,
city text,
mintemp integer,
maxtemp integer
);
तालिका विनिर्देश जानबूझकर स्तंभ बाधाओं से रहित है और चीजों को सरल रखने के लिए प्राथमिक कुंजी - हम इन्हें बाद में जोड़ देंगे।
यह पाया जाना बहुत आम है कि कई अनुप्रयोगों में हाल ही में सबसे अधिक डेटा अधिक बार एक्सेस किया जाता है। चालू वित्तीय वर्ष, इस महीने, अंतिम घंटे आदि के बारे में सोचें। जैसे-जैसे हमारी "तापमान" तालिका बढ़ती है, पुराने डेटा को उसी संरचना के साथ किसी अन्य तालिका में स्थानांतरित करना समझ में आता है। उदाहरण के लिए, हम यह कर सकते हैं:
CREATE TABLE temperatures_2017 (LIKE temperatures);
INSERT INTO temperatures_2017 SELECT * FROM temperatures WHERE
extract(year from at) = 2017;
DELETE FROM temperatures WHERE extract(year from at) = 2017;
वर्ष 2017 से सभी प्रविष्टियों को दूसरी तालिका में स्थानांतरित करने के लिए। यह एप्लिकेशन के साथ काम करने के लिए मुख्य "तापमान" तालिका को छोटा और तेज़ छोड़ देता है। एक बोनस के रूप में, यदि आपको अब पुराने डेटा को हटाने की आवश्यकता है, तो आप मुख्य / वर्तमान तालिका में आने वाले डेटा के सम्मिलन को धीमा किए बिना ऐसा कर सकते हैं क्योंकि पुराना डेटा रहता है किसी अन्य तालिका में।
लेकिन कई, अलग-अलग टेबल होने का मतलब है कि एप्लिकेशन कोड को अब बदलना होगा। यदि इसे पुराने डेटा तक पहुंचना है, जैसे कि किसी शहर का वार्षिक न्यूनतम और अधिकतम तापमान प्राप्त करना, तो अब यह पता लगाना होगा कि स्कीमा में कौन सी तालिकाएँ मौजूद हैं, उनमें से प्रत्येक को क्वेरी करें और प्रत्येक तालिका से परिणामों को संयोजित करें। क्या एप्लिकेशन कोड बदले बिना हम ऐसा कर सकते हैं?
विभाजन इसे संभव बनाता है। PostgreSQL 10 में, आप इस तरह "तापमान" तालिका बना सकते हैं:
CREATE TABLE temperatures (
at date,
city text,
mintemp integer,
maxtemp integer
)
PARTITION BY RANGE (at);
यह "तापमान" को एक विभाजन मास्टर टेबल बनाता है, और PostgreSQL को बताता है कि हम गैर-अतिव्यापी डेटा को संग्रहीत करने वाले कई विभाजित टेबल बनाने जा रहे हैं, प्रत्येक में "at" मानों के एक अलग सेट के साथ। मास्टर टेबल में स्वयं कोई डेटा नहीं होता है, लेकिन आवेदन द्वारा पूछताछ और सम्मिलित किया जा सकता है - जो वास्तविक डेटा रखने वाले बच्चे के विभाजन से अनजान है।
और यहाँ हमारे विभाजन हैं:
CREATE TABLE temperatures_2017
PARTITION OF temperatures
FOR VALUES FROM ('2017-01-01') TO ('2018-01-01');
CREATE TABLE temperatures_2018
PARTITION OF temperatures
FOR VALUES FROM ('2018-01-01') TO ('2019-01-01');
अब हमारे पास दो टेबल हैं, एक जो 2017 के लिए डेटा स्टोर करेगा और दूसरा 2018 के लिए। ध्यान दें कि "से" मान समावेशी है, लेकिन "से" मान नहीं है। आइए इसे आज़माएं:
temp=# INSERT INTO temperatures (at, city, mintemp, maxtemp)
temp-# VALUES ('2018-08-03', 'London', 63, 90);
INSERT 0 1
temp=# INSERT INTO temperatures (at, city, mintemp, maxtemp)
temp-# VALUES ('2017-08-03', 'London', 59, 70);
INSERT 0 1
temp=# SELECT * FROM temperatures;
at | city | mintemp | maxtemp
------------+--------+---------+---------
2017-08-03 | London | 59 | 70
2018-08-03 | London | 63 | 90
(2 rows)
temp=# SELECT * FROM temperatures_2017;
at | city | mintemp | maxtemp
------------+--------+---------+---------
2017-08-03 | London | 59 | 70
(1 row)
temp=# SELECT * FROM temperatures_2018;
at | city | mintemp | maxtemp
------------+--------+---------+---------
2018-08-03 | London | 63 | 90
(1 row)
"एप्लिकेशन" मुख्य तालिका में सम्मिलित करने और चुनने में सक्षम है, लेकिन PostgreSQL वास्तविक डेटा को उपयुक्त चाइल्ड टेबल में रूट करता है। (ओह औरBTW, वे तापमान वास्तविक हैं!)
इंडेक्स और बाधाएं
इंडेक्स और टेबल और कॉलम की कमी वास्तव में विभाजन योग्य स्तर पर परिभाषित की जाती है, क्योंकि यह वह जगह है जहां वास्तविक डेटा रहता है। आप विभाजन तालिका निर्माण के दौरान इन्हें सेट कर सकते हैं:
CREATE TABLE temperatures_2017
PARTITION OF temperatures (
mintemp NOT NULL,
maxtemp NOT NULL,
CHECK (mintemp <= maxtemp),
PRIMARY KEY (at, city)
)
FOR VALUES FROM ('2017-01-01') TO ('2018-01-01');
PostgreSQL 11 आपको मूल तालिका पर अनुक्रमणिका को परिभाषित करने देता है, और मौजूदा और भविष्य के विभाजन तालिकाओं पर अनुक्रमणिका बनाएगा। यहां और पढ़ें।
विदेशी डेटा आवरण
कुछ समय के लिए पोस्टग्रेज में विदेशी डेटा रैपरफंक्शनलिटी मौजूद है। PostgreSQL आपको इस तंत्र का उपयोग करके अन्य सर्वर और सिस्टम में संग्रहीत डेटा तक पहुंचने देता है। हम जिस चीज में रुचि रखते हैं वह है "postgres_fdw", जो हमें एक पोस्टग्रेज सर्वर को दूसरे से एक्सेस करने की अनुमति देगा।
"postgres_fdw" मानक वितरण में मौजूद एक एक्सटेंशन है, जिसे नियमित CREATE EXTENSION कमांड के साथ स्थापित किया जा सकता है:
CREATE EXTENSION postgres_fdw;
मान लें कि आपके पास "box2db" नामक डेटाबेस के साथ एक और PostgreSQL सर्वर "box2" है। आप इसके लिए "विदेशी सर्वर" बना सकते हैं:
CREATE SERVER box2 FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'box2', dbname 'box2db');
आइए हमारे उपयोगकर्ता "एलिस" (जिस उपयोगकर्ता के रूप में आपने लॉग इन किया है) को बॉक्स 2 उपयोगकर्ता "बॉक्स 2 एलिस" में मैप करें। यह दूरस्थ तालिकाओं तक पहुँचने पर "ऐलिस" को "box2alice" होने की अनुमति देता है:
CREATE USER MAPPING FOR alice SERVER box2
OPTIONS (user 'box2alice');
अब आप बॉक्स 2 पर टेबल (दृश्य, मैटव्यू आदि) तक पहुंच सकते हैं। सबसे पहले, बॉक्स 2 पर एक टेबल बनाएं, और फिर अपने सर्वर पर एक "विदेशी टेबल" बनाएं। विदेशी टेबल में कोई वास्तविक डेटा नहीं होता है, लेकिन टेबलन बॉक्स 2 तक पहुंचने के लिए प्रॉक्सी के रूप में कार्य करता है।
-- on box2
CREATE TABLE foo (a int);
-- on your server
IMPORT FOREIGN SCHEMA public LIMIT TO (foo)
FROM SERVER box2 INTO public;
आपके सर्वर की विदेशी तालिका सामान्य तालिकाओं की तरह ही लेन-देन में भाग ले सकती है। अनुप्रयोगों को यह जानने की आवश्यकता नहीं है कि जिन तालिकाओं के साथ यह बातचीत करता है वे स्थानीय या विदेशी हैं - हालांकि यदि आपका ऐप एक चयन चलाता है जो एक विदेशी तालिका से बहुत सारी पंक्तियों को खींच सकता है तो यह चीजों को धीमा कर सकता है। पोस्टग्रेस 10 में, शामिल होने को धक्का देने के लिए सुधार किए गए थे और दूरस्थ सर्वर पर एकत्रित करता है।
विभाजन और FDW का संयोजन
और अब मज़ेदार भाग के लिए:दूरस्थ सर्वर पर विभाजन सेट करना।
सबसे पहले, बॉक्स2 पर भौतिक विभाजन तालिका बनाते हैं:
-- on box2
CREATE TABLE temperatures_2016 (
at date,
city text,
mintemp integer,
maxtemp integer
);
और फिर अपने सर्वर पर एक विदेशी तालिका के रूप में विभाजन बनाएँ:
CREATE FOREIGN TABLE temperatures_2016
PARTITION OF temperatures
FOR VALUES FROM ('2016-01-01') TO ('2017-01-01')
SERVER box2;
अब आप अपने सर्वर से सम्मिलित और क्वेरी कर सकते हैं:
temp=# INSERT INTO temperatures (at, city, mintemp, maxtemp)
temp-# VALUES ('2016-08-03', 'London', 63, 73);
INSERT 0 1
temp=# SELECT * FROM temperatures ORDER BY at;
at | city | mintemp | maxtemp
------------+--------+---------+---------
2016-08-03 | London | 63 | 73
2017-08-03 | London | 59 | 70
2018-08-03 | London | 63 | 90
(3 rows)
temp=# SELECT * FROM temperatures_2016;
at | city | mintemp | maxtemp
------------+--------+---------+---------
2016-08-03 | London | 63 | 73
(1 row)
ये लो! एक दूरस्थ विभाजन में पंक्तियों को सम्मिलित करने में सक्षम होना संस्करण 11 में नया है। इस सुविधा के साथ, अब आप अपने डेटा को तार्किक रूप से (विभाजन) और भौतिक रूप से (FDW) शार्प कर सकते हैं।
डेटा प्रबंधन
VACUUM और ANALYZE जैसे कमांड विभाजन मास्टर टेबल के साथ आपकी अपेक्षा के अनुरूप काम करते हैं- सभी स्थानीय चाइल्ड टेबल VACUUM और ANALYZE के अधीन हैं। विभाजन को अलग किया जा सकता है, यह विभाजन की बाधा के बिना डेटा में हेरफेर किया जाता है, और फिर इसे फिर से जोड़ा जाता है। विभाजन चाइल्ड टेबल को स्वयं विभाजित किया जा सकता है।
डेटा को इधर-उधर ले जाना ("रीशर्डिंग") नियमित SQL स्टेटमेंट (इन्सर्ट, डिलीट, कॉपी आदि) के साथ किया जा सकता है। विभाजन-स्थानीय अनुक्रमणिका और ट्रिगर बनाए जा सकते हैं।
तार्किक या स्ट्रीमिंग प्रतिकृति के साथ अपने शार्क में अतिरेक जोड़ना आसानी से प्राप्त किया जाता है।