2012-08-03 17 views
13

मान लें कि हमारे पास 6 मिलियन रिकॉर्ड के साथ एक टेबल है। 16 पूर्णांक कॉलम और कुछ टेक्स्ट कॉलम हैं। यह केवल पढ़ने योग्य तालिका है इसलिए प्रत्येक पूर्णांक कॉलम में एक अनुक्रमणिका होती है। प्रत्येक रिकॉर्ड लगभग 50-60 बाइट्स है।पोस्टग्रेस्क्ल - बड़े डेटाबेस में सरणी का उपयोग करने का प्रदर्शन

तालिका का नाम "आइटम"
सर्वर है: 12 जीबी रैम, 1,5 टीबी सैटा, 4 कोर। पोस्टग्रेज़ के लिए सभी सर्वर।
इस डेटाबेस में कई और टेबल हैं इसलिए रैम सभी डेटाबेस को कवर नहीं करता है।

मैं तालिका "आइटम" में एक कॉलम "a_elements" (सरणी प्रकार के बड़े पूर्णांक) में जोड़ना चाहता हूं प्रत्येक रिकॉर्ड में इस कॉलम में 50-60 से अधिक तत्व नहीं होंगे।

उसके बाद मैं इस स्तंभ और विशिष्ट क्वेरी पर सूचकांक जिन बनाने इस तरह दिखना चाहिए होगा:

select * from item where ...... and '{5}' <@ a_elements; 

मैं भी दूसरे, और अधिक शास्त्रीय, विकल्प होता है।

दो कॉलम के साथ तालिका आइटम करने के लिए स्तंभ a_elements जोड़ने मत लेकिन बनाने तालिका तत्वों:

  • id_item
  • id_element

इस तालिका में लगभग 200 मिलियन रिकॉर्ड होगा।

मैं इस टेबल पर विभाजन करने में सक्षम हूं इसलिए तालिका तत्वों में तालिका रिकॉर्ड में 500 मिलीलीटर और तालिका आइटम में 500 के लिए कम हो जाएगा।

दूसरा विकल्प क्वेरी इस तरह दिखता है:

select item.* 
from item 
    left join elements on (item.id_item=elements.id_item) 
where .... 
and 5 = elements.id_element 

मुझे आश्चर्य है कि क्या विकल्प देखने के प्रदर्शन बिंदु पर बेहतर होगा। क्या पोस्टर एक ही क्वेरी में इंडेक्स जीआईएन (विकल्प 1) के साथ कई अलग-अलग इंडेक्स का उपयोग करने में सक्षम है?

मुझे एक अच्छा निर्णय लेने की आवश्यकता है क्योंकि इस डेटा के आयात में मुझे 20 दिन लगेंगे।

+1

हाय! और आपका अंतिम निर्णय क्या है? मेरे पास लगभग एक ही स्थिति है। –

उत्तर

10

मुझे लगता है कि आप एक elements तालिका का उपयोग करना चाहिए:

  • Postgres भविष्यवाणी करने के लिए कितने पंक्तियों क्वेरी निष्पादित करने से पहले की पूर्ति करेंगे, आंकड़ों का उपयोग करने में सक्षम होगा, तो यह सबसे अच्छा क्वेरी योजना का उपयोग करने में सक्षम होगा (यदि आपका डेटा समान रूप से वितरित नहीं किया जाता है तो यह अधिक महत्वपूर्ण है);

  • आप CLUSTER elements USING elements_id_element_idx का उपयोग कर क्वेरी डेटा को स्थानीयकृत करने में सक्षम होंगे;

  • जब पोस्टग्रेस 9.2 जारी किया जाएगा तो आप केवल सूचकांक का लाभ लेने में सक्षम होंगे;

लेकिन मैं 10M तत्वों के लिए कुछ परीक्षण किए हैं:

create table elements (id_item bigint, id_element bigint); 
insert into elements 
    select (random()*524288)::int, (random()*32768)::int 
    from generate_series(1,10000000); 

\timing 
create index elements_id_item on elements(id_item); 
Time: 15470,685 ms 
create index elements_id_element on elements(id_element); 
Time: 15121,090 ms 

select relation, pg_size_pretty(pg_relation_size(relation)) 
    from (
    select unnest(array['elements','elements_id_item', 'elements_id_element']) 
     as relation 
) as _; 
     relation  | pg_size_pretty 
---------------------+---------------- 
elements   | 422 MB 
elements_id_item | 214 MB 
elements_id_element | 214 MB 



create table arrays (id_item bigint, a_elements bigint[]); 
insert into arrays select array_agg(id_element) from elements group by id_item; 

create index arrays_a_elements_idx on arrays using gin (a_elements); 
Time: 22102,700 ms 

select relation, pg_size_pretty(pg_relation_size(relation)) 
    from (
    select unnest(array['arrays','arrays_a_elements_idx']) as relation 
) as _; 
     relation  | pg_size_pretty 
-----------------------+---------------- 
arrays    | 108 MB 
arrays_a_elements_idx | 73 MB 

तो में दूसरी ओर सरणियों छोटे होते हैं, और छोटे सूचकांक की है। निर्णय लेने से पहले मैं कुछ 200 एम तत्व परीक्षण करता हूं।

संबंधित मुद्दे