PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Postgres KIRI GABUNG dengan SUM, catatan hilang

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.

SQL Fiddle.

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi agregat penjumlahan array berpasangan?

  2. Cara Membuat Pengguna Dengan Hak Istimewa Superuser di PostgreSQL

  3. Fungsi PL/pgSQL:Cara mengembalikan tabel normal dengan banyak kolom menggunakan pernyataan eksekusi

  4. Alembik:ubah tipe kolom dengan MENGGUNAKAN

  5. Permintaan rekaman terbaru yang efisien dengan Postgresql