2012-10-05 37 views
12

इस विषय पर मेरे पिछले सवाल, Postgres combining multiple Indexes से इसे जारी रखते हुए:Postgres GIST बनाम BTREE सूचकांक

मैं पर Postgres 9.2 (PostGIS के साथ) निम्न तालिका है

CREATE TABLE updates (
    update_id character varying(50) NOT NULL, 
    coords geography(Point,4326) NOT NULL, 
    user_id character varying(50) NOT NULL, 
    created_at timestamp without time zone NOT NULL 
); 

और मैं निम्न क्वेरी चला रहा हूँ मेज पर:

select * 
from updates 
where ST_DWithin(coords, ST_MakePoint(-126.4, 45.32)::geography, 30000) 
and user_id='3212312' 
order by created_at desc 
limit 60 

तो यह देखते हुए कि, क्या सूचकांक मैं के लिए (coords + user_id), GIST या BTREE इस्तेमाल करना चाहिए?

CREATE INDEX ix_coords_user_id ON updates USING GIST (coords, user_id); 

या

CREATE INDEX ix_coords_user_id ON updates (coords, user_id); 

मैं पढ़ रहा था कि BTREE GIST तुलना में बेहतर प्रदर्शन है, लेकिन मैं के बाद से मैं PostGIS भूगोल क्षेत्र का उपयोग कर रहा GIST उपयोग करने के लिए मजबूर कर दिया ??

+0

कृपया दोनों के लिए 'विश्लेषण व्याख्या करें' दिखाएं; http://explain.depesz.com/ पर योजनाओं को पेस्ट करें और यहां लिंक करें। –

उत्तर

11

यदि आप नियमित बी-पेड़ इंडेक्स (या हैश इंडेक्स) के अलावा किसी भी इंडेक्स विधि का उपयोग करना चाहते हैं तो आपको GiST का उपयोग करना होगा, लेकिन उन्हें वास्तव में उपयोग नहीं किया जाना चाहिए)। पोस्टजीआईएस इंडेक्स को जीएसटीटी की आवश्यकता है।

बी पेड़ अनुक्रमित केवल समानता या आदेश, = की तरह, <, <=, >, >=, <>, BETWEEN और IN से जुड़े बुनियादी कार्यों के लिए इस्तेमाल किया जा सकता। जबकि आप एक geomtery ऑब्जेक्ट (बिंदु, क्षेत्र, आदि) पर एक बी-पेड़ सूचकांक बना सकते हैं, यह वास्तव में समानता के लिए उपयोग किया जा सकता है क्योंकि > जैसी तुलना क्रमशः ऐसी वस्तुओं के लिए व्यर्थ हैं। एक जीआईएसटी इंडेक्स को "जटिल", "छेड़छाड़" आदि जैसे अधिक जटिल और सामान्य तुलनाओं का समर्थन करने की आवश्यकता है।

आप जीएसटीटी के लिए बी-पेड़ इंडेक्सिंग सक्षम करने के लिए btree_gist extension का उपयोग कर सकते हैं। यह नियमित रूप से बी-वृक्ष अनुक्रमित की तुलना में काफी धीमी है, लेकिन आप एक बहु स्तंभ अनुक्रमणिका कि text, integer की तरह दोनों सार-केवल प्रकार और नियमित प्रकार होते हैं, आदि इन स्थितियों तुम सच में की जरूरत में


बनाने की अनुमति देता explain analyze (explain.depesz.com इस के लिए उपयोगी है) का उपयोग करने के लिए यह जांचने के लिए कि पीजी विभिन्न इंडेक्स और आपके द्वारा बनाए गए इंडेक्स के संयोजनों का उपयोग कैसे करता है। मल्टी-कॉलम इंडेक्स में विभिन्न कॉलम ऑर्डरिंग आज़माएं, और देखें कि दो या दो से अधिक अलग इंडेक्स अधिक प्रभावी हैं या नहीं।

मुझे दृढ़ता से संदेह है कि आपको इस मामले में बहुविकल्पीय जीआईएसटी इंडेक्स के साथ सबसे अच्छे परिणाम मिलेंगे, लेकिन मैं इंडेक्स और इंडेक्स कॉलम ऑर्डरिंग के कई अलग-अलग संयोजनों को देखने की कोशिश करता हूं।

+0

लेकिन मैं btree का उपयोग करके (coords, user_id) पर बहु-कॉलम इंडेक्स बनाने में सक्षम हूं, इसलिए सुनिश्चित नहीं है कि धीमी GIST अनुक्रमणिका यहां क्या लाभ देती है? – kapso

+2

@ user310525 सिर्फ इसलिए कि आप इंडेक्स बना सकते हैं इसका मतलब यह नहीं है कि यह आपके लिए कुछ भी उपयोगी कर रहा है। यह देखने के लिए कि कौन से इंडेक्स का उपयोग किया जाता है और कैसे 'विश्लेषण विश्लेषण' आउटपुट की जांच करें। बी-पेड़ इंडेक्स का उपयोग केवल '=', '<', '<=', '>', '> =', '<>' और 'BETWEEN' के लिए किया जा सकता है - इसलिए यह संभावना है कि यह आपकी क्वेरी के पोस्टजीआईएस भाग के लिए बिल्कुल भी अच्छा नहीं कर रहा है और आप '(user_id)' पर एक कॉलम बी-पेड़ इंडेक्स के साथ बेहतर हो जाएंगे। –

+0

@ user310525 'ST_DWithin' किसी भी उपलब्ध ज्यामिति इंडेक्स का उपयोग करने के लिए प्रलेखित है, इसलिए इसे जीआईएसटी इंडेक्स से लाभ होना चाहिए, लेकिन मुझे संदेह है कि यह ज्यामिति प्रकार पर बी-पेड़ इंडेक्स का कोई भी उपयोग कर सकता है जब तक कि यह समानता तुलना नहीं कर सकता। –