पहला तात्कालिक उपाय यह होगा कि आप अपनी क्वेरी को थोड़ा तेज़ करें:
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
है चाभी? ...
विशेष, बहुत तेज़ अनुक्रमणिका के साथ संबंधित उत्तर:
संबंधित: