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

नेस्टेड jsonb कॉलम पर GROUP BY + COUNT DISTINCT को ऑप्टिमाइज़ करना

मान लें कि id न केवल UNIQUE - जैसा कि आपके UNIQUE INDEX . द्वारा लागू किया गया है - लेकिन यह भी NOT NULL . (यह आपकी तालिका परिभाषा में अनुपलब्ध है।)

SELECT meta_split.key, meta_split.value, count(*)
FROM   voc_cc348779bdc84f8aab483f662a798a6a v
CROSS  JOIN LATERAL jsonb_each(v.meta) AS meta_split
GROUP  BY meta_split.key, meta_split.value;

छोटा समकक्ष:

SELECT meta_split.key, meta_split.value, count(*)
FROM   voc_cc348779bdc84f8aab483f662a798a6a v, jsonb_each(v.meta) AS meta_split
GROUP  BY 1, 2;

LEFT [OUTER] JOIN शोर था क्योंकि निम्नलिखित परीक्षण WHERE meta_split.value IS NOT NULL एक INNER JOIN के लिए बाध्य करता है वैसे भी। CROSS JOIN का उपयोग करना इसके बजाय।

साथ ही, jsonb . के बाद से डुप्लीकेट कुंजियों को समान स्तर पर वैसे भी अनुमति नहीं देता (अर्थात् समान id केवल एक बार पॉप अप हो सकता है प्रति (key, value) ), DISTINCT सिर्फ महंगा शोर है। count(v.id) वही सस्ता करता है। और count(*) समतुल्य है, और सस्ता है, फिर भी - id . मानते हुए NOT NULL है जैसा कि ऊपर बताया गया है।

count(*) एक अलग कार्यान्वयन है और count(<value>) . से थोड़ा तेज है . यह count(v.*) . से सूक्ष्म रूप से भिन्न है . यह सभी पंक्तियों को गिनता है, चाहे कुछ भी हो। जबकि दूसरा फॉर्म NULL . की गणना नहीं करता है मान।

यानी जब तक id NULL नहीं हो सकता - जैसा कि ऊपर बताया गया है। id वास्तव में PRIMARY KEY होना चाहिए , जो किसी भी तरह आंतरिक रूप से एक अद्वितीय बी-ट्री इंडेक्स के साथ कार्यान्वित किया जाता है, और सभी कॉलम - बस id यहाँ - हैं NOT NULL परोक्ष रूप से। या कम से कम NOT NULL . एक UNIQUE INDEX प्रतिस्थापन के रूप में पूरी तरह से योग्य नहीं है, यह अभी भी NULL . की अनुमति देता है मान जिन्हें समान नहीं माना जाता है और जिन्हें कई बार अनुमति दी जाती है। देखें:

इसके अलावा, यहां अनुक्रमणिका का कोई उपयोग नहीं है, क्योंकि सभी पंक्तियों को वैसे भी पढ़ा जाना है। तो यह कभी भी बहुत सस्ता नहीं होने वाला है। लेकिन 62k पंक्तियां किसी भी तरह से एक अपंग पंक्ति गणना नहीं है - जब तक कि आपके पास jsonb में बड़ी संख्या में कुंजियाँ न हों कॉलम।

इसे तेज करने के लिए शेष विकल्प:

  1. अपने डिजाइन को सामान्य करें। JSON दस्तावेज़ों को अननेस्ट करना मुफ़्त नहीं है।

  2. एक भौतिक दृष्टिकोण बनाए रखें। व्यवहार्यता और लागत दृढ़ता से आपके लेखन पैटर्न पर निर्भर करती है।

यहीं पर अनुक्रमणिकाएँ फिर से भूमिका निभा सकती हैं ...




  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 11:विभाजन पैच के लिए पैच समीक्षक

  2. PostGIS के साथ एक सामान्य भूगोल स्तंभ होना

  3. Postgresql को किसी दिए गए वर्ष में सभी iso सप्ताह का पहला और अंतिम दिन मिलता है

  4. रिकॉर्ड प्राप्त करें जहां जेसन कॉलम कुंजी रिक्त है

  5. क्या INSERT [...] संघर्ष पर विदेशी कुंजी उल्लंघनों के लिए उपयोग किया जा सकता है?