2008-08-22 13 views
34

मुझे कौन सी जानकारी मिल सकती है, वे दोनों एक ही समस्या का समाधान करते हैं - सरणी नियंत्रण और चौराहे जैसे अधिक गूढ़ संचालन (&, @>, < @, आदि)। हालांकि मुझे एक या दूसरे (या न तो संभवतः) का उपयोग करने के बारे में सलाह में दिलचस्पी होगी।PostgreSQL: जीआईएन या जीआईएसटी इंडेक्स?

  • जिन सूचकांक लुकअप के बारे में तीन बार सार
  • जिन अनुक्रमित की तुलना में तेजी रहे हैं लेने के बारे में तीन बार लंबे समय तक सार
  • जिन अनुक्रमित से निर्माण करने के लिए के बारे में दस गुना कम होती है:
    PostgreSQL documentation इस बारे में कुछ जानकारी है सार
  • जिन अनुक्रमित से अद्यतन करने के लिए हालांकि मैं विशेष रूप से मैं होगा दो-से-तीन से सार

बड़ा बार कर रहे हैं यह जानने में दिलचस्पी है कि क्या प्रदर्शन प्रभाव होता है जब सूचकांक आकार राशन की स्मृति छोटी हो रही है (यानी। सूचकांक आकार उपलब्ध स्मृति से कहीं बड़ा हो जाता है)? मुझे # पोस्टग्रेस्क्ल आईआरसी चैनल पर बताया गया है कि जीआईएन को सभी इंडेक्स को स्मृति में रखने की जरूरत है, अन्यथा यह प्रभावी नहीं होगा, क्योंकि बी-ट्री के विपरीत, यह नहीं जानता कि डिस्क से कौन सा हिस्सा पढ़ना है एक विशेष प्रश्न? सवाल यह होगा: क्या यह सच है (क्योंकि मुझे इसके विपरीत भी बताया गया है)? क्या जीएसटीटी के पास एक ही प्रतिबंध है? क्या इन प्रतिबंधों में से एक इंडेक्सिंग एल्गोरिदम का उपयोग करते समय मुझे अन्य प्रतिबंधों के बारे में पता होना चाहिए?

+0

ये माप आप जिस पीजी का उपयोग कर रहे हैं उसके अनुसार भिन्न होते हैं। मैंने अभी एक हिस्टोर कॉलम के खिलाफ 9.6.1 के तहत एक परीक्षण चलाया और निम्न प्राप्त किया: जीआईएसटी ने जीआईएन की तुलना में 4.1 गुना अधिक समय लिया और लुकअप के लिए लगभग 170 गुना धीमा था। आपके द्वारा उद्धृत आंकड़ों के करीब भी नहीं। – IamIC

उत्तर

14

सबसे पहले, क्या आपको टेक्स्ट खोज अनुक्रमण के लिए उनका उपयोग करने की आवश्यकता है? जीआईएन और जीआईएसटी कुछ डेटा प्रकारों के लिए विशेषीकृत सूचकांक हैं। यदि आपको सरल चार या पूर्णांक मानों को अनुक्रमणित करने की आवश्यकता है तो सामान्य बी-ट्री इंडेक्स सबसे अच्छा है।
वैसे भी, PostgreSQL दस्तावेज़ GIST पर एक अध्याय है और एक GIN पर, जहां आप अधिक जानकारी प्राप्त कर सकते हैं।
और, आखिरी लेकिन कम से कम नहीं, सबसे अच्छा तरीका खोजने के लिए सबसे अच्छा तरीका नमूना डेटा उत्पन्न करना है (जितना आपको वास्तविक परिदृश्य होना चाहिए) और फिर एक गिस्ट इंडेक्स बनाएं, यह मापने के लिए कि कितना समय आवश्यक है इंडेक्स, एक नया मान डालें, नमूना क्वेरी निष्पादित करें। फिर इंडेक्स ड्रॉप करें और जीआईएन इंडेक्स के साथ ऐसा ही करें। मूल्यों की तुलना करें और आपके डेटा के आधार पर आपके पास आवश्यक उत्तर होगा।

+8

हां, लेकिन समय होने की समस्या है, अगर किसी को पहले से ही पता है तो पूछना अधिक बुद्धिमान है ... –

+11

मुझे लगता है कि आपके डेटा को उत्पन्न करना ही एकमात्र उत्तर है। मैंने कुछ दिन पढ़ने के लिए कुछ समय बिताया जो मैं पूर्ण-पाठ और जिस्ट और जीन इंडेक्स के बारे में स्थानिक, इंडेक्स के साथ डालने या बंद करने, postgres.sql में सेटिंग्स को नियंत्रित करना और # पोस्टगिस/# पोस्टग्रेस्क्ल पर लोगों से बात करना और अंत में आया निष्कर्ष तक कि वास्तव में सुनिश्चित करने का एकमात्र तरीका, मेरे बहुत विशिष्ट उपयोग के लिए, मेरे वास्तविक डेटा के बड़े सबसेट और परीक्षण के साथ टेस्ट टेबल लोड करना था। यदि आप यहां या वहां एक दिन बचाने के लिए सेटअप के दौरान भागते हैं, तो आप अगले वर्षों में हफ्तों को बर्बाद कर देंगे, मैंने कठिन अनुभव से सीखा है। –