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

समूहवार अधिकतम क्वेरी अनुकूलित करें

अपेक्षाकृत कुछ मानते हुए options में पंक्तियाँ records में कई पंक्तियों के लिए

आमतौर पर, आपके पास एक लुक-अप तालिका options . होगा जिसे records.option_id . से संदर्भित किया गया है , आदर्श रूप से एक विदेशी कुंजी बाधा के साथ। यदि आप ऐसा नहीं करते हैं, तो मेरा सुझाव है कि संदर्भात्मक अखंडता को लागू करने के लिए एक बनाएं:

CREATE TABLE options (
  option_id int  PRIMARY KEY
, option    text UNIQUE NOT NULL
);

INSERT INTO options
SELECT DISTINCT option_id, 'option' || option_id -- dummy option names
FROM   records;

फिर किसी ढीले इंडेक्स स्कैन का अनुकरण करने की कोई आवश्यकता नहीं है और यह बहुत सरल और तेज़ becomes हो जाता है . सहसंबद्ध उपश्रेणियाँ (option_id, id) . पर एक सादे अनुक्रमणिका का उपयोग कर सकती हैं ।

SELECT option_id, (SELECT max(id)
                   FROM   records
                   WHERE  option_id = o.option_id) AS max_id
FROM   options o
ORDER  BY 1;

इसमें वे विकल्प शामिल हैं जिनका तालिका records में कोई मिलान नहीं है . आपको max_id . के लिए NULL मिलता है और आप बाहरी SELECT . में ऐसी पंक्तियों को आसानी से हटा सकते हैं यदि आवश्यक हो।

या (एक ही परिणाम):

SELECT option_id, (SELECT id
                   FROM   records
                   WHERE  option_id = o.option_id
                   ORDER  BY id DESC NULLS LAST
                   LIMIT  1) AS max_id
FROM   options o
ORDER  BY 1;

थोड़ा तेज हो सकता है। सबक्वेरी सॉर्ट क्रम का उपयोग करता है DESC NULLS LAST - समग्र कार्य के समान max() जो NULL मानों को अनदेखा करता है। केवल DESC को छांटना पहले NULL होगा:

  • एक PostgreSQL क्वेरी में DESC ऑर्डर करते समय NULL मान पहले क्यों आते हैं?

इसके लिए एकदम सही सूचकांक:

CREATE INDEX on records (option_id, id DESC NULLS LAST);

इंडेक्स सॉर्ट ऑर्डर ज्यादा मायने नहीं रखता है जबकि कॉलम परिभाषित हैं NOT NULL

छोटी तालिका options . पर अभी भी अनुक्रमिक स्कैन हो सकता है , यह सभी पंक्तियों को लाने का सबसे तेज़ तरीका है। ORDER BY पूर्व-क्रमित पंक्तियों को लाने के लिए एक अनुक्रमणिका (केवल) स्कैन ला सकता है।
बड़ी तालिका records केवल (बिटमैप) इंडेक्स स्कैन के माध्यम से एक्सेस किया जाता है या, यदि संभव हो तो, इंडेक्स-ओनली स्कैन

db<>फिडल यहाँ - साधारण केस के लिए दो इंडेक्स-ओनली स्कैन दिखा रहा है
Old sqlfiddle

या LATERAL का उपयोग करें Postgres 9.3+ में समान प्रभाव के लिए जुड़ता है:

  • प्रति उपयोगकर्ता नवीनतम पंक्ति पुनर्प्राप्त करने के लिए क्वेरी द्वारा समूह को अनुकूलित करें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ubuntu 20.04 पर PostgreSQL स्थापित करें

  2. किसी दिए गए कुंजी के प्रत्येक उदाहरण के लिए नवीनतम पंक्ति प्राप्त करने के लिए SQL क्वेरी

  3. Oracle से PostgreSQL:माइग्रेट करने के कारण

  4. कॉलम एएससी द्वारा क्रमबद्ध करें, लेकिन पहले नल मान?

  5. दूसरा चतुर्थांश Deutschland - विशेष प्रशिक्षण शुरुआती सौदेबाजी