PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

JSON पर PostgreSQL इंडेक्स

आपके अन्य दो इंडेक्स केवल इसलिए काम नहीं करेंगे क्योंकि ->> ऑपरेटर देता है text , जबकि आपके पास स्पष्ट रूप से jsonb . है जिन ऑपरेटर कक्षाओं को ध्यान में रखते हुए। ध्यान दें कि आप केवल json . का उल्लेख करते हैं , लेकिन आपको वास्तव में jsonb . की आवश्यकता है उन्नत अनुक्रमण क्षमताओं के लिए।

सर्वोत्तम अनुक्रमण रणनीति तैयार करने के लिए, आपको अधिक बारीकी से परिभाषित करना होगा कि किन प्रश्नों को कवर करना है। क्या आप केवल गायों में रुचि रखते हैं? या सभी जानवर/सभी टैग? कौन से ऑपरेटर संभव हैं? क्या आपके JSON दस्तावेज़ में गैर-पशु कुंजी भी शामिल है? इनका क्या करें? क्या आप उस अनुक्रमणिका में पंक्तियाँ शामिल करना चाहते हैं जहाँ गाय (या जो कुछ भी) JSON दस्तावेज़ में बिल्कुल भी नहीं दिखाई देती हैं?

मानते हुए:

  • घोंसले के पहले स्तर पर हम केवल गायों में रुचि रखते हैं।
  • मान हमेशा एक मान्य integer होता है ।
  • हमें गायों के बिना पंक्तियों में कोई दिलचस्पी नहीं है।

मैं एक कार्यात्मक btree अनुक्रमणिका का सुझाव देता हूं, जैसा कि आपके पास पहले से है, लेकिन मान को integer पर डालें . मुझे नहीं लगता कि आप चाहते हैं कि तुलना का मूल्यांकन text . के रूप में किया जाए (जहाँ '2' '1111' से बड़ा है)।

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int));  -- !

कास्ट शॉर्टहैंड के लिए कोष्ठक के अतिरिक्त सेट की आवश्यकता होती है ताकि इंडेक्स एक्सप्रेशन के लिए सिंटैक्स स्पष्ट हो सके।

पोस्टग्रेज़ को यह एहसास दिलाने के लिए कि इंडेक्स लागू है, अपने प्रश्नों में उसी अभिव्यक्ति का उपयोग करें:

SELECT * FROM farm WHERE (animal ->> 'cow')::int > 3;

यदि आपको अधिक सामान्य jsonb की आवश्यकता है सूचकांक, विचार करें:

  • Postgres jsonb में सरणियों में संरचनाओं को क्वेरी करने के लिए उचित अनुक्रमणिका क्या है?

ज्ञात, स्थिर, तुच्छ . के लिए जानवरों की संख्या (जैसे आपने टिप्पणी की), मैं आंशिक अनुक्रमणिका का सुझाव देता हूं जैसे:

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int))
WHERE (animal ->> 'cow') IS NOT NULL;

CREATE INDEX animal_index ON farm (((animal ->> 'chicken')::int))
WHERE (animal ->> 'chicken') IS NOT NULL;

आदि।

आपको क्वेरी में अनुक्रमणिका शर्त जोड़नी पड़ सकती है:

SELECT * FROM farm
WHERE (animal ->> 'cow')::int > 3
AND   (animal ->> 'cow') IS NOT NULL; 

बेमानी लग सकता है, लेकिन आवश्यक हो सकता है। ANALYZE . के साथ परीक्षण करें !




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में XMLTABLE

  2. Postgresql में एक विशिष्ट कॉलम वाली तालिका कैसे खोजें?

  3. UNION, EXCEPT, या INTERSECT का उपयोग करते समय PostgreSQL में “ERROR:  तालिका के लिए FROM-क्लॉज प्रविष्टि अनुपलब्ध” को ठीक करें

  4. कॉलम निर्दिष्ट किए बिना SQL INSERT। क्या होता है?

  5. PL/pgSQL के साथ PostgreSQL में रिकॉर्ड के रूप में एकाधिक फ़ील्ड लौटाएं