यह वैसे ही है जैसे आप jjanes से कहीं और पढ़ते हैं:एक अभिव्यक्ति अनुक्रमणिका केवल तभी मानी जाती है जब अभिव्यक्ति क्वेरी में सटीक रूप से मेल खाती है। Postgres क्वेरी प्लानर AI नहीं है। यदि प्रश्नों की योजना बनाने में बहुत अधिक समय लगता है तो यह शीघ्रता से प्रश्नों को बनाने के उद्देश्य को विफल कर देगा।
आप अपनी अनुक्रमणिका को थोड़ा सा अनुकूलित कर सकते हैं, यदि यह कोई सांत्वना है। left()
substring()
. की तुलना में सरल और तेज़ है :
CREATE INDEX record_changes_log_detail_old_value_ix_btree
ON record_changes_log_detail (left(old_value,1024) text_pattern_ops);
साथ ही, एक अधिकतम पंक्ति आकार 2704 बाइट्स . है btree अनुक्रमणिका के लिए, नहीं "बी-पेड़ों पर 2172 वर्ण सीमा" ।
सबसे महत्वपूर्ण बात, केवल समानता जांच के लिए, जैसा कि आपके प्रश्न से पता चलता है, md5(old_value)
का उपयोग करके हैश मान पर एक btree अनुक्रमणिका या hashtext(old_value)
बहुत होगा अधिक कुशल। यदि आप ऐसा करते हैं, तो हैश टकराव से बचाव करना न भूलें इस तरह:
SELECT *
FROM record_changes_log_detail
WHERE hashtext(old_value) = hashtext('Gold Kerrison Neuro')
AND old_value = 'Gold Kerrison Neuro';
पहला विधेय आपको तेज़ अनुक्रमणिका पहुँच प्रदान करता है। दूसरा झूठी सकारात्मक को बाहर करता है। टकराव अत्यंत दुर्लभ होना चाहिए। लेकिन संभव है। और संभावना तालिका के आकार के साथ बढ़ती है।
संबंधित:
- ग्राफ़ के लिए तालिका-संरचना पर DISTINCT के साथ चयन क्वेरी बहुत धीमी है
- MD5 फ़ील्ड के लिए इष्टतम डेटा प्रकार क्या है?
- काउचडीबी में पूर्ण-पाठ खोज
या आप जैसा हैश इंडेक्स पहले से ही खुद पर विचार कर रहा है:
- पोस्टग्रेज 11 हैश इंडेक्स इतना बड़ा क्यों है?
(यहां आपको हैश टकराव के बारे में चिंता करने की ज़रूरत नहीं है; आंतरिक रूप से संभाला जाता है।)