@Tregoreg ने अपनी पेशकश के लिए टिप्पणी में एक सवाल उठाया :
मुझे वर्तमान उत्तर काम नहीं मिला। सरणी-टाइप किए गए कॉलम पर GIN इंडेक्स का उपयोग करने से किसी भी () ऑपरेटर के प्रदर्शन में वृद्धि नहीं होती है। क्या वास्तव में कोई समाधान नहीं है?
@ फ्रैंक का स्वीकृत उत्तर आपको एरे ऑपरेटरों का उपयोग करने के लिए कहता है , जो अभी भी पोस्टग्रेज 11 के लिए सही है । मैनुअल:
... PostgreSQL के मानक वितरण में सरणियों के लिए GIN ऑपरेटर वर्ग शामिल है, जो इन ऑपरेटरों का उपयोग करके अनुक्रमित प्रश्नों का समर्थन करता है:
<@
@>
=
&&
मानक वितरण में GIN अनुक्रमित के लिए अंतर्निहित ऑपरेटर कक्षाओं की पूरी सूची यहां है।
पोस्टग्रैज इंडेक्स में ऑपरेटरों के लिए बाध्य होते हैं (जो कुछ प्रकारों के लिए लागू होते हैं), अकेले डेटा प्रकार या फ़ंक्शन या कुछ और नहीं। यह पोस्टग्रेज के मूल बर्कले डिजाइन से एक विरासत है और अब बदलना बहुत मुश्किल है। और यह आम तौर पर ठीक काम कर रहा है। यहाँ टॉम लेन की टिप्पणी के साथ pgsql- बग पर एक धागा है।
कुछ पोस्टगिस फ़ंक्शन (जैसे ST_DWithin()
) इस प्रिंसिपल का उल्लंघन करते हैं, लेकिन ऐसा नहीं है। उन कार्यों को संबंधित ऑपरेटरों का उपयोग करने के लिए आंतरिक रूप से फिर से लिखा जाता है ।
अनुक्रमित अभिव्यक्ति ऑपरेटर के बाईं ओर होनी चाहिए । अधिकांश ऑपरेटरों ( उपरोक्त सभी सहित ) के लिए, क्वेरी प्लानर फ़्लिपिंग ऑपरेंड्स द्वारा इसे प्राप्त कर सकते हैं यदि आप अनुक्रमित अभिव्यक्ति को सही स्थान पर रखते हैं - जिसे COMMUTATOR
परिभाषित किया गया है। ANY
निर्माण विभिन्न ऑपरेटरों के साथ संयोजन में उपयोग किया जा सकता है और एक ऑपरेटर ही नहीं है। जब सरणी तत्वों पर ऑपरेटर का constant = ANY (array_expression)
समर्थन करने वाले केवल अनुक्रमित के रूप में उपयोग किया जाता है और हमें इसके लिए एक कम्यूटेटर की आवश्यकता होगी । GIN सूचकांक बाहर हैं।=
= ANY()
Postgres वर्तमान में GIN-indexable अभिव्यक्ति प्राप्त करने के लिए पर्याप्त स्मार्ट नहीं है। शुरुआत के लिए, constant = ANY (array_expression)
है पूरी तरह से बराबर नहीं करने के लिए array_expression @> ARRAY[constant]
। किसी भी NULL तत्वों के शामिल होने पर Array ऑपरेटर्स एक त्रुटि लौटाते हैं, जबकि ANY
निर्माण NULL से किसी भी तरफ निपट सकता है। और डेटा प्रकार के बेमेल के लिए अलग-अलग परिणाम हैं।
संबंधित उत्तर:
Asides
मूल्यों के बिना integer
सरणियों ( int4
, नहीं int2
या नहीं int8
) के साथ काम करते समय NULL
(जैसे आपके उदाहरण का तात्पर्य है) अतिरिक्त मॉड्यूल पर विचार करें intarray
, जो विशेष, तेज ऑपरेटरों और सूचकांक समर्थन प्रदान करता है। देख:
के रूप में UNIQUE
के पर एक BTREE सूचकांक के साथ लागू किया है कि: अपने प्रश्न में बाधा है कि अनुत्तरित चला गया पूरे सरणी मूल्य (जैसे आप संदिग्ध) और के लिए खोज के साथ मदद नहीं करता है तत्वों सब पर। विवरण:
jsonb
का उपयोग करना और अनुक्रमित का उपयोग करना संभव है ? postgresql.org/docs/9.5/static/functions-json.html और postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING