BTREE
यहाँ मेरा मुद्दा यह है कि BTree इंडेक्स भारी होगा क्योंकि यह डुप्लिकेट मानों को संग्रहीत करेगा (यह भी है, क्योंकि यह नहीं मान सकता है कि तालिका भौतिक रूप से सॉर्ट की गई है)। अगर BTree बहुत बड़ा है, तो मैं अंत में सूचकांक और तालिका के दोनों हिस्सों को पढ़ता हूं, जो सूचकांक को भी इंगित करता है ...
जरूरी नहीं - बीटीआर इंडेक्स होने के कारण जो 'कवर' है, वह सबसे तेजी से पढ़ा जाने वाला समय होगा, और यदि वह सब आप चाहते हैं (यानी यदि आप अतिरिक्त भंडारण का खर्च उठा सकते हैं), तो यह आपका सबसे अच्छा दांव है।
ब्रिन
मेरी समझ यह है कि बेकार पन्नों को पढ़ने की कीमत पर मैं यहां एक छोटा सूचकांक रख सकता हूं। एक छोटे से उपयोग का pages_per_range
मतलब है कि सूचकांक बड़ा है (जो कि BRIN के साथ एक समस्या है क्योंकि मुझे पूरे सूचकांक को पढ़ने की आवश्यकता है), एक बड़ा pages_per_range
साधन होने का मतलब है कि मैं बहुत सारे बेकार पृष्ठ पढ़ूंगा ।
यदि आप एक कवरिंग btree इंडेक्स के स्टोरेज ओवरहेड को वहन नहीं कर सकते हैं, तो BRIN आपके लिए आदर्श है, क्योंकि आपके पास पहले से ही क्लस्टरिंग है (यह BRIN के उपयोगी होने के लिए महत्वपूर्ण है)। BRIN इंडेक्स छोटे होते हैं , इसलिए यदि आप उचित मूल्य चुनते हैं तो सभी पेज मेमोरी में होने की संभावना है pages_per_range
।
क्या उन ट्रेड ऑफ़्स को ध्यान में रखने वाले Pages_per_range का अच्छा मूल्य खोजने के लिए कोई जादू फार्मूला है?
कोई जादू सूत्र नहीं है, लेकिन औसत मूल्य के कब्जे वाले औसत आकार (पृष्ठों में) की pages_per_range
तुलना में कुछ कम से शुरू होता है a
। आप संभवतः कम करने की कोशिश कर रहे हैं: (BRIN स्कैन किए गए पृष्ठों की संख्या) + एक विशिष्ट क्वेरी के लिए (ढेर पृष्ठों की स्कैन की गई संख्या)। के लिए Heap Blocks: lossy=n
निष्पादन योजना के लिए देखें pages_per_range=1
और अन्य मूल्यों के साथ तुलना करें pages_per_range
- यानी देखें कि कितने अनावश्यक ढेर ब्लॉक स्कैन किए जा रहे हैं।
जिन / सार
सुनिश्चित नहीं हैं कि वे यहां प्रासंगिक हैं क्योंकि वे ज्यादातर पूर्ण पाठ खोज के लिए उपयोग किए जाते हैं, लेकिन मैं यह भी सुनता हूं कि वे डुप्लिकेट कुंजियों से निपटने में अच्छे हैं। या तो एक GIN
/ GiST
सूचकांक यहाँ मदद करेगा?
जीआईएन विचार करने योग्य हो सकता है, लेकिन शायद जीएसटी नहीं - हालांकि अगर प्राकृतिक क्लस्टरिंग वास्तव में अच्छा है, तो ब्रिन शायद बेहतर दांव होगा।
यहाँ डमी डेटा के लिए अलग सूचकांक प्रकारों के बीच एक नमूना तुलना आपकी तरह है:
तालिका और अनुक्रमित:
create table foo(a,b,c) as
select *, lpad('',20)
from (select chr(g) a from generate_series(97,122) g) a
cross join (select generate_series(1,100000) b) b
order by a;
create index foo_btree_covering on foo(a,b);
create index foo_btree on foo(a);
create index foo_gin on foo using gin(a);
create index foo_brin_2 on foo using brin(a) with (pages_per_range=2);
create index foo_brin_4 on foo using brin(a) with (pages_per_range=4);
vacuum analyze;
संबंध आकार:
select relname "name", pg_size_pretty(siz) "size", siz/8192 pages, (select count(*) from foo)*8192/siz "rows/page"
from( select relname, pg_relation_size(C.oid) siz
from pg_class c join pg_namespace n on n.oid = c.relnamespace
where nspname = current_schema ) z;
नाम | आकार | पेज | पंक्तियों / पेज
: ----------------- | : ------ | ----: | --------:
फू | 149 एमबी | 19118 | 135
foo_btree_covering | 56 एमबी | 7132 | 364
foo_btree | 56 एमबी | 7132 | 364
foo_gin | 2928 केबी | 366 | 7103
foo_brin_2 | 264 केबी | 33 | 78,787
foo_brin_4 | 136 केबी | 17 | 152,941
कवर btree:
explain analyze select sum(b) from foo where a='a';
| QUERY PLAN |
| : ------------------------------------------------- -------------------------------------------------- ------------------------------------------- |
| सकल (लागत = 3282.57..3282.58 पंक्तियाँ = 1 चौड़ाई = 8) (वास्तविक समय = 45.942..45.942 पंक्तियाँ = 1 छोर = 1) |
| -> सूचकांक केवल foo_btree_covering पर foo (लागत = 0.43..3017.80 पंक्तियों = 105907 चौड़ाई = 4) का उपयोग करके स्कैन करें (वास्तविक समय = 0.038..27.286 पंक्तियों = 100000 छोरों = 1) |
| सूचकांक कंडोम: (a = 'a' :: text) |
| हीप कामोत्तेजक: 0 |
| योजना समय: 0.099 एमएस |
| निष्पादन समय: 45.968 एमएस |
सादा btree:
drop index foo_btree_covering;
explain analyze select sum(b) from foo where a='a';
| QUERY PLAN |
| : ------------------------------------------------- -------------------------------------------------- ----------------------------- |
| सकल (लागत = 4064.57..4064.58 पंक्तियाँ = 1 चौड़ाई = 8) (वास्तविक समय = 54.242..54.242 पंक्तियाँ = 1 छोर = 1) |
| -> सूचकांक स्कैन foo_btree पर foo (लागत = 0.43..3799.80 पंक्तियों = 105907 चौड़ाई = 4) का उपयोग कर (वास्तविक समय = 0.037..33.084 पंक्तियों = 100000 छोरों = 1) |
| सूचकांक कंडोम: (a = 'a' :: text) |
| योजना समय: 0.135 एमएस |
| निष्पादन समय: 54.280 एमएस |
BRIN Pages_per_range = 4:
drop index foo_btree;
explain analyze select sum(b) from foo where a='a';
| QUERY PLAN |
| : ------------------------------------------------- -------------------------------------------------- ----------------------------- |
| सकल (लागत = 21595.38..21595.39 पंक्तियाँ = 1 चौड़ाई = 8) (वास्तविक समय = 52.455..52.455 पंक्तियाँ = 1 छोर = 1) |
| -> बिटमैप ढेर स्कैन foo (लागत = 888.78..21330.61 पंक्तियों = 105907 चौड़ाई = 4) (वास्तविक समय = 2.738..31.967 पंक्तियों = 100000 छोरों = 1) |
| Recheck Cond: (a = 'a' :: text) |
| अनुक्रमणिका रीचेक द्वारा हटाए गए पंक्तियों: 96 |
| ढेर ब्लॉक: हानिपूर्ण = 736 |
| -> foo_brin_4 (लागत = 0.00..862.30 पंक्तियों = 105907 चौड़ाई = 0) पर बिटमैप इंडेक्स स्कैन (वास्तविक समय = 2.720..2.720 पंक्तियों = 7360 छोरों = 1) |
| सूचकांक कंडोम: (a = 'a' :: text) |
| योजना समय: 0.101 एमएस |
| निष्पादन समय: 52.501 एमएस |
BRIN Pages_per_range = 2:
drop index foo_brin_4;
explain analyze select sum(b) from foo where a='a';
| QUERY PLAN |
| : ------------------------------------------------- -------------------------------------------------- ----------------------------- |
| सकल (लागत = 21659.38..21659.39 पंक्तियाँ = 1 चौड़ाई = 8) (वास्तविक समय = 53.971..53.971 पंक्तियाँ = 1 छोर = 1) |
| -> बिटमैप ढेर स्कैन foo (लागत = 952.78..21394.61 पंक्तियों = 105907 चौड़ाई = 4) (वास्तविक समय = 5.286..33.492 पंक्तियों = 100000 छोरों = 1) |
| Recheck Cond: (a = 'a' :: text) |
| अनुक्रमणिका रीचेक द्वारा हटाए गए पंक्तियों: 96 |
| ढेर ब्लॉक: हानिपूर्ण = 736 |
| -> foo_brin_2 (लागत = 0.00..926.30 पंक्तियों = 105907 चौड़ाई = 0) पर बिटमैप इंडेक्स स्कैन (वास्तविक समय = 5.275..5.275 पंक्तियों = 7360 छोरों = 1) |
| सूचकांक कंडोम: (a = 'a' :: text) |
| योजना समय: 0.095 एमएस |
| निष्पादन समय: 54.016 एमएस |
जिन:
drop index foo_brin_2;
explain analyze select sum(b) from foo where a='a';
| QUERY PLAN |
| : ------------------------------------------------- -------------------------------------------------- ------------------------------ |
| समुच्चय (लागत = 21687.38..21687.39 पंक्तियों = 1 चौड़ाई = 8) (वास्तविक समय = 55.331..55.331 पंक्तियाँ = 1 छोर = 1) |
| -> बिटमैप ढेर स्कैन फू (लागत = 980.78..21422.61 पंक्तियों = 105907 चौड़ाई = 4) (वास्तविक समय = 12.377..33.956 पंक्तियों = 100000 छोरों = 1) |
| Recheck Cond: (a = 'a' :: text) |
| ढेर ब्लॉक: सटीक = 736 |
| -> बिटमैप इंडेक्स स्कैन foo_gin (लागत = 0.00..954.30 पंक्तियों = 105907 चौड़ाई = 0) (वास्तविक समय = 12.271..12.271 पंक्तियों = 100000 छोरों = 1) |
| सूचकांक कंडोम: (a = 'a' :: text) |
| योजना समय: 0.118 एमएस |
| निष्पादन समय: 55.366 एमएस |
यहाँ dbfiddle