Biasanya tercepat jika Anda mengambil semua atau sebagian besar baris :
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;
Indeks tidak relevan di sini, pemindaian tabel lengkap akan menjadi yang tercepat. Kecuali jika hewan peliharaan hidup adalah langka kasus, maka indeks parsial harus membantu. Seperti:
CREATE INDEX pets_alive_idx ON pets (person_id, kind) WHERE alive;
Saya menyertakan semua kolom yang diperlukan untuk kueri (person_id, kind)
untuk mengizinkan pemindaian indeks saja.
Biasanya tercepat untuk bagian kecil atau satu baris :
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;
Anda setidaknya harus memiliki indeks di pets.person_id
untuk ini (atau indeks parsial dari atas) - dan mungkin lebih, tergantung pada WHERE
kondisi.
Jawaban terkait:
- Kueri dengan LEFT JOIN tidak mengembalikan baris untuk hitungan 0
- GROUP atau DISTINCT setelahnya GABUNG mengembalikan duplikat
- Dapatkan hitungan kunci asing dari beberapa tabel