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

वस्तुओं के jsonb सरणी में नेस्टेड प्रमुख मानों के लिए रेंज टेस्ट को गति दें

पहला तात्कालिक उपाय यह होगा कि आप अपनी क्वेरी को थोड़ा तेज़ करें:

SELECT *
FROM   parents p
WHERE  EXISTS (
   SELECT FROM jsonb_array_elements(p.children) c
   WHERE (c->>'age')::int BETWEEN 10 AND 12
   );

EXISTS सेमी-जॉइन इंटरमीडिएट टेबल में पंक्तियों के दोहराव से बचा जाता है जब कई सरणी ऑब्जेक्ट मेल खाते हैं - और DISTINCT ON की आवश्यकता होती है बाहरी क्वेरी में। लेकिन यह केवल हल्का तेज़ है, फिर भी।

मुख्य समस्या यह है कि आप पूर्णांक मानों की श्रेणी . के लिए परीक्षण करना चाहते हैं , जबकि मौजूदा jsonb ऑपरेटरों ऐसी कार्यक्षमता प्रदान न करें।

इसके चारों ओर विभिन्न तरीके हैं। इनमें से कोई भी नहीं जानते, यहां एक "स्मार्ट" समाधान है जो दिए गए उदाहरण को हल करता है। ट्रिक यह है कि रेंज को अलग-अलग मानों में विभाजित किया जाए और jsonb . का उपयोग किया जाए कंटेन्मेंट ऑपरेटर @> :

SELECT *
FROM   parents p
WHERE (p.children @> '[{"age": 10}]'
OR     p.children @> '[{"age": 11}]'
OR     p.children @> '[{"age": 12}]');

jsonb_path_ops . द्वारा समर्थित GIN इंडेक्स:

CREATE INDEX parents_children_gin_idx ON parents USING gin (children jsonb_path_ops);

लेकिन अगर आपकी श्रेणियां पूर्णांक मानों से भरे हाथ से अधिक फैली हुई हैं, तो आपको कुछ और सामान्य की आवश्यकता होगी। हमेशा की तरह , सबसे अच्छा समाधान पूरी स्थिति पर निर्भर करता है:डेटा वितरण, मूल्य आवृत्तियों, प्रश्नों में विशिष्ट श्रेणियां, NULL मान संभव?, पंक्ति आकार, पढ़ने/लिखने के पैटर्न, हर करता है jsonb मान का एक या अधिक मिलान age है चाभी? ...

विशेष, बहुत तेज़ अनुक्रमणिका के साथ संबंधित उत्तर:

संबंधित:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psql वापसी कोड यदि शून्य पंक्तियाँ मिलीं

  2. पोस्टग्रेज कॉपी कमांड, बाइनरी फाइल

  3. रेल 3.2.* और पोस्टग्रेज़ का उपयोग करके स्ट्रिंग बनाम टेक्स्ट - क्या मुझे हमेशा टेक्स्ट का उपयोग करना चाहिए?

  4. Postgresql - दिए गए डेटाटाइम मान के सापेक्ष निकटतम डेटाटाइम पंक्ति प्राप्त करें

  5. क्वेरी में एक कॉलम को कई कॉलमों के साथ एकत्रित करें