आमतौर पर सबसे तेज़ यदि आप सभी या अधिकतर पंक्तियाँ प्राप्त करते हैं :
SELECT pp.id
, COALESCE(pt.a_dog_ct, 0) AS alive_dogs_count
, COALESCE(pt.a_cat_ct, 0) AS alive_cats_count
FROM people pp
LEFT JOIN (
SELECT person_id
, count(kind = 'dog' OR NULL) AS a_dog_ct
, count(kind = 'cat' OR NULL) AS a_cat_ct
FROM pets
WHERE alive
GROUP BY 1
) pt ON pt.person_id = pp.id;
यहां अनुक्रमणिका अप्रासंगिक हैं, पूर्ण तालिका स्कैन सबसे तेज़ होंगे। छोड़कर यदि जीवित पालतू जानवर दुर्लभ हैं मामला, फिर एक आंशिक अनुक्रमणिका मदद करनी चाहिए। पसंद:
CREATE INDEX pets_alive_idx ON pets (person_id, kind) WHERE alive;
मैंने क्वेरी के लिए आवश्यक सभी कॉलम शामिल किए (person_id, kind)
केवल अनुक्रमणिका स्कैन की अनुमति देने के लिए।
आमतौर पर छोटे उपसमुच्चय या एकल पंक्ति . के लिए सबसे तेज़ :
SELECT pp.id
, count(kind = 'dog' OR NULL) AS alive_dogs_count
, count(kind = 'cat' OR NULL) AS alive_cats_count
FROM people pp
LEFT JOIN pets pt ON pt.person_id = pp.id
AND pt.alive
WHERE <some condition to retrieve a small subset>
GROUP BY 1;
आपके पास कम से कम pets.person_id
. पर एक इंडेक्स होना चाहिए इसके लिए (या ऊपर से आंशिक सूचकांक) - और संभवतः अधिक, आयन के आधार पर WHERE
हालत।
संबंधित उत्तर:
- इसके साथ क्वेरी करें LEFT JOIN 0 की गिनती के लिए पंक्तियों को वापस नहीं कर रहा है
- GROUP या DISTINCT के बाद जॉइन डुप्लिकेट लौटाता है
- गिनती पाएं एकाधिक तालिकाओं से विदेशी कुंजी का