मैं एक नया PostgreSQL 9 डेटाबेस स्थापित कर रहा हूं जिसमें लाखों (या शायद अरबों) पंक्तियां होंगी। तो मैंने PostgreSQL विरासत का उपयोग कर डेटा विभाजन करने का फैसला किया।सही विभाजन नियम का चयन
CREATE TABLE mytable
(
user_id integer,
year integer,
CONSTRAINT pk_mytable PRIMARY KEY (user_id, year)
);
और 10 पार्टीशन टेबल:
मैं इस तरह एक मास्टर तालिका (उदाहरण के लिए सरलीकृत) बनाया
CREATE TABLE mytable_0() INHERITS (mytable);
CREATE TABLE mytable_1() INHERITS (mytable);
...
CREATE TABLE mytable_9() INHERITS (mytable);
मुझे पता है कि पंक्तियों हमेशा एक अद्वितीय का उपयोग कर आवेदन से पहुँचा जा जाएगा user_id हालत। तो मैं user_id के आधार पर नियम का उपयोग करके 10 टेबलों पर समान रूप से "काफी" डेटा प्रसारित करना चाहता हूं।
मास्टर मेज पर धुन प्रश्नों के लिए, मेरा पहला विचार एक मापांक जांच बाधा का इस्तेमाल किया गया:
ALTER TABLE mytable_0 ADD CONSTRAINT mytable_user_id_check CHECK (user_id % 10 = 0);
ALTER TABLE mytable_1 ADD CONSTRAINT mytable_user_id_check CHECK (user_id % 10 = 1);
...
समस्या यह है, जब मैं user_id, PostgreSQL पर शर्त के साथ मास्टर तालिका "mytable" क्वेरी विश्लेषक सभी तालिकाओं की जाँच करें और जाँच बाधा से लाभ नहीं मिलता:
EXPLAIN SELECT * FROM mytable WHERE user_id = 12345;
"Result (cost=0.00..152.69 rows=64 width=36)"
" -> Append (cost=0.00..152.69 rows=64 width=36)"
" -> Seq Scan on mytable (cost=0.00..25.38 rows=6 width=36)"
" Filter: (user_id = 12345)"
" -> Seq Scan on mytable_0 mytable (cost=0.00..1.29 rows=1 width=36)"
" Filter: (user_id = 12345)"
" -> Seq Scan on mytable_1 mytable (cost=0.00..1.52 rows=1 width=36)"
" Filter: (user_id = 12345)"
...
" -> Seq Scan on mytable_9 mytable (cost=0.00..1.52 rows=1 width=36)"
" Filter: (user_id = 12345)"
जबकि यदि मैं (और पुनः विभाजन है कि उस नियम से मेल) इस तरह एक क्लासिक जाँच प्रतिबंध का उपयोग करें:
ALTER TABLE mytable_0 ADD CONSTRAINT mytable_user_id_check CHECK (user_id BETWEEN 1 AND 10000);
ALTER TABLE mytable_1 ADD CONSTRAINT mytable_user_id_check CHECK (user_id BETWEEN 10001 AND 20000);
...
यह केवल तालिकाओं हालत (mytable और इस उदाहरण में mytable_1) से मेल स्कैन करेगा:
"Result (cost=0.00..152.69 rows=64 width=36)"
" -> Append (cost=0.00..152.69 rows=64 width=36)"
" -> Seq Scan on mytable (cost=0.00..25.38 rows=6 width=36)"
" Filter: (user_id = 12345)"
" -> Seq Scan on mytable_1 mytable (cost=0.00..1.52 rows=1 width=36)"
" Filter: (user_id = 12345)"
लेकिन इस तरह की जांच बाधा का उपयोग कर बनाए रखने के लिए कठिन है क्योंकि उन की सीमा है कि में से भरी हुई होगी वर्षों में टेबल बदल जाएगा। हजारों पहले, शायद निकट भविष्य में लाखों या उससे अधिक ...
10 टेबल पर मेरे डेटा को समान रूप से विभाजित करने के लिए मैं किस नियम का उपयोग कर सकता हूं जो चेक बाधा से लाभ उठा सकता है ताकि मास्टर टेबल पर एक चयन केवल स्कैन करेगा सही टेबल ...?
धन्यवाद, निको