एक आंशिक अनुक्रमणिका एक अच्छा विचार है तालिका की आधी पंक्तियों को बाहर करने के लिए जिनकी आपको स्पष्ट रूप से आवश्यकता नहीं है। आसान:
CREATE INDEX name_idx ON table (text_col)
WHERE text_col IS NOT NULL;
ANALYZE table
चलाना सुनिश्चित करें सूचकांक बनाने के बाद। (ऑटोवैक्यूम कुछ समय बाद स्वचालित रूप से ऐसा करता है यदि आप इसे मैन्युअल रूप से नहीं करते हैं, लेकिन यदि आप निर्माण के ठीक बाद परीक्षण करते हैं, तो आपका परीक्षण विफल हो जाएगा।)
फिर, क्वेरी प्लानर को यह समझाने के लिए कि एक विशेष आंशिक अनुक्रमणिका का उपयोग किया जा सकता है, WHERE
दोहराएं क्वेरी में स्थिति - भले ही यह पूरी तरह से बेमानी लगती हो:
SELECT col1,col2, .. colN
FROM table
WHERE text_col = 'my_value'
AND text_col IS NOT NULL; -- repeat condition
वोइला।
प्रति दस्तावेज़:
<ब्लॉककोट>
हालांकि, ध्यान रखें कि विधेय को उन प्रश्नों में प्रयुक्त शर्तों से मेल खाना चाहिए जो सूचकांक से लाभान्वित होने वाले हैं। सटीक रूप से, एक आंशिक अनुक्रमणिका का उपयोग किसी क्वेरी में केवल तभी किया जा सकता है जब सिस्टम यह पहचान सके कि WHERE
क्वेरी की स्थिति गणितीय रूप से सूचकांक के विधेय को दर्शाती है। PostgreSQL में एक परिष्कृत प्रमेय कहावत नहीं है जो गणितीय रूप से समकक्ष अभिव्यक्तियों को पहचान सकता है जो विभिन्न रूपों में लिखे गए हैं। (न केवल इस तरह के एक सामान्य प्रमेय कहावत बनाना बेहद मुश्किल है, यह शायद किसी भी वास्तविक उपयोग के लिए बहुत धीमा होगा।) प्रणाली सरल असमानता के प्रभावों को पहचान सकती है, उदाहरण के लिए "x <1" का अर्थ "x <2" है; अन्यथा विधेय शर्त पूरी तरह से क्वेरी के WHERE
. के हिस्से से मेल खानी चाहिए कंडीशन या इंडेक्स को प्रयोग करने योग्य नहीं माना जाएगा। मिलान क्वेरी प्लानिंग समय पर होता है, रन टाइम पर नहीं। परिणामस्वरूप, पैरामीटरयुक्त क्वेरी क्लॉज़ आंशिक अनुक्रमणिका के साथ काम नहीं करते हैं।
पैरामीटरयुक्त प्रश्नों के लिए:फिर से, आंशिक अनुक्रमणिका के (अनावश्यक) विधेय को एक अतिरिक्त, स्थिर WHERE
के रूप में जोड़ें हालत, और यह ठीक काम करता है।
9.6 पोस्ट करें . में एक महत्वपूर्ण अपडेट केवल-अनुक्रमणिका स्कैन के अवसरों में काफी सुधार करता है (जो प्रश्नों को सस्ता बना सकता है और क्वेरी योजनाकार ऐसी क्वेरी योजनाओं को अधिक आसानी से चुनेगा)। संबंधित:
- PostgreSQL गिनती के दौरान अनुक्रमणिका का उपयोग नहीं कर रहा है(*)