आप टेक्स्ट कॉलम पर text_pattern_ops को क्यों अनुक्रमित करेंगे?


18

आज सेवन वीक में सेवन डेटाबेस ने मुझे प्रति-ऑपरेटर इंडेक्स से परिचित कराया।

आप text_pattern_opsऑपरेटर क्लास इंडेक्स बनाकर पिछले प्रश्नों से मेल खाते पैटर्न के लिए स्ट्रिंग्स को इंडेक्स कर सकते हैं , जब तक कि लोअरकेस में मान इंडेक्स किए जाते हैं।

CREATE INDEX moves_title_pattern ON movies (
    (lower(title) text_pattern_ops);

हमने उपयोग किया text_pattern_opsक्योंकि शीर्षक टाइप टेक्स्ट का है। आप की जरूरत सूचकांक varchars, वर्ण, या नाम के लिए हैं, तो संबंधित ऑप्स का उपयोग करें: varchar_pattern_ops, bpchar_pattern_ops, औरname_pattern_ops

मुझे लगता है उदाहरण वास्तव में भ्रामक है। ऐसा करना क्यों उपयोगी है?

यदि स्तंभ टाइप पाठ है, तो क्या अन्य प्रकार (varchar, char, name) को खोज मूल्य के रूप में उपयोग किए जाने से पहले पाठ में नहीं डाला जाएगा?

डिफ़ॉल्ट ऑपरेटर का उपयोग करके वह इंडेक्स एक से अलग तरीके से कैसे व्यवहार करता है?

CREATE INDEX moves_title_pattern ON movies (lower(title));

1
यह संबंधित प्रश्न मदद के लिए हो सकता है: dba.stackexchange.com/questions/10694/…
Erwin Brandstetter

धन्यवाद, इरविन। पुस्तक में विचारों पर शोध करते समय उस प्रश्न का आपका उत्तर बहुत उपयोगी था।
इयान सैमुअल मैकलीन एल्डर

जवाबों:


20

प्रलेखन अक्सर आपको इस तरह के सवालों का जवाब देता है। इस मामले में भी, जैसे :

ऑपरेटर क्लासेस text_pattern_ops, varchar_pattern_ops, और bpchar_pattern_ops क्रमशः टेक्स्ट, varchar और char पर बी-ट्री इंडेक्स का समर्थन करते हैं। डिफ़ॉल्ट ऑपरेटर वर्गों से अंतर यह है कि मूल्यों की तुलना चरित्र द्वारा सख्ती से की जाती है बजाय स्थानीय-विशिष्ट टकराव के नियमों के। जब डेटाबेस डेटाबेस मानक "C" लोकेल का उपयोग नहीं करता है, तो इन ऑपरेटर वर्गों को पैटर्न मिलान अभिव्यक्ति (LIKE या POSIX नियमित अभिव्यक्ति) से जुड़े प्रश्नों द्वारा उपयोग के लिए उपयुक्त बनाता है । एक उदाहरण के रूप में, आप इस तरह एक varchar कॉलम को अनुक्रमित कर सकते हैं:

CREATE INDEX test_index ON test_table (col varchar_pattern_ops);

ध्यान दें कि यदि आप सामान्य <, <=>, या> = किसी इंडेक्स का उपयोग करने की तुलना करने वाले प्रश्नों को चाहते हैं, तो आपको डिफ़ॉल्ट ऑपरेटर वर्ग के साथ एक इंडेक्स भी बनाना चाहिए ऐसे प्रश्न xxx_pattern_ops ऑपरेटर कक्षाओं का उपयोग नहीं कर सकते हैं । (साधारण समानता तुलना इन ऑपरेटर वर्गों का उपयोग कर सकते हैं, हालांकि।) अलग-अलग ऑपरेटर वर्गों के साथ एक ही कॉलम पर कई इंडेक्स बनाना संभव है।

कहने के लिए प्रलेखन आगे बढ़ता है:

यदि आप C लोकेल का उपयोग करते हैं, तो आपको xxx_pattern_ops ऑपरेटर कक्षाओं की आवश्यकता नहीं है, क्योंकि डिफ़ॉल्ट ऑपरेटर वर्ग के साथ एक सूचकांक सी लोकेल में पैटर्न-मिलान प्रश्नों के लिए उपयोग करने योग्य है।

आप अपने स्थान की जाँच इस प्रकार कर सकते हैं (यह "C" के बजाय UTF8 होने की संभावना है):

postgres=> show lc_collate;
 lc_collate
-------------
 en_GB.UTF-8

अहा! मैंने पढ़ा है कि, लेकिन इसका पालन करना कठिन था इसलिए इसे नहीं लिया। क्या आप कहेंगे text_pattern_opsकि स्थानीय लोगों पर निर्भरता की उपयोगी उपयोगिता क्या है ? ऐसा लगता है कि इससे मुझे लाभ होगा क्योंकि मेरा स्थान 'en_US.UTF-8' ('C' नहीं) है, इसलिए पैटर्न क्वेरीज़ डिफ़ॉल्ट इंडेक्स का उपयोग नहीं कर सकते हैं।
इयान सैमुअल मैकलीन एल्डर

बिल्कुल सही। मैं जोड़ूंगा (लेकिन यह केवल अटकलें हैं) कि बुनियादी ASCII वर्णों के अंदर रहने वाले डेटा के साथ डिफ़ॉल्ट ऑपरेटर वर्ग बस उतना ही अच्छा है - कम से कम मुझे ऐसे इंडेक्स का उपयोग करते हुए 'कुछ%' के साथ प्रश्न दिखाई देते हैं।
dezso

5
@ डिडज़ो: यदि आपने LIKEएक सादा बी-ट्री इंडेक्स का उपयोग करते हुए क्वेरी देखी है , तो डीबी को Cलोकेल का उपयोग करना चाहिए । या सूचकांक COLLATE "POSIX"(या COLLATE "C") के साथ परिभाषित किया गया है और क्वेरी एक मिलान निर्दिष्ट करती है COLLATION। किसी अन्य टकराव के साथ, सूचकांक का आदेश स्थानीय नियमों से मेल नहीं खाता है और इसलिए इसका उपयोग पैटर्न मिलान के लिए नहीं किया जा सकता है।
इरविन ब्रांडस्टेट्टर

1
@ErwinBrandstetter मुझे पुष्टि करनी है, आप सही हैं।
डेज़ो

1
@StopHarmingMonica आपको सही प्रतिक्रिया (और कोई त्रुटि नहीं) मिलती है, बस क्वेरी संभवतः धीमी होगी, इंडेक्स का उपयोग करने में सक्षम नहीं।
dezso
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.