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

mengoptimalkan Query di PostgreSQL

Memformat ulang rencana kueri Anda untuk kejelasan:

QUERY PLAN Aggregate (cost=126377.96..126377.97 rows=1 width=0)
  -> Hash Join (cost=6014.51..126225.38 rows=61033 width=0)
     Hash Cond: (contacts_lists.contact_id = plain_contacts.contact_id)
    -> Hash Join (cost=3067.30..121828.63 rows=61033 width=8)
       Hash Cond: (contacts_lists.contact_id = contacts.id)
      -> Index Scan using index_contacts_lists_on_list_id_and_contact_id
         on contacts_lists (cost=0.00..116909.97 rows=61033 width=4)
         Index Cond: (list_id = 66996)
         -> Hash (cost=1721.41..1721.41 rows=84551 width=4)
         -> Seq Scan on contacts (cost=0.00..1721.41 rows=84551 width=4)
            Filter: ((NOT email_bad) AND (NOT email_unsub))
            -> Hash (cost=2474.97..2474.97 rows=37779 width=4)
            -> Seq Scan on plain_contacts (cost=0.00..2474.97 rows=37779 width=4)
               Filter: has_email

Dua indeks parsial mungkin hilangkan pemindaian seq tergantung pada distribusi data Anda:

-- if many contacts have bad emails or are unsubscribed:
CREATE INDEX contacts_valid_email_idx ON contacts (id)
WHERE (NOT email_bad AND NOT email_unsub);

-- if many contacts have no email:
CREATE INDEX plain_contacts_valid_email_idx ON plain_contacts (id)
WHERE (has_email);

Anda mungkin kehilangan indeks pada kunci asing:

CREATE INDEX plain_contacts_contact_id_idx ON plain_contacts (contact_id);

Last but not least jika Anda belum pernah menganalisis data Anda, Anda perlu menjalankan:

VACUUM ANALYZE;

Jika masih lambat setelah semua selesai, tidak banyak yang dapat Anda lakukan selain menggabungkan plain_contacts dan tabel kontak Anda:mendapatkan paket kueri di atas terlepas dari indeks di atas berarti sebagian besar/semua pelanggan Anda berlangganan itu daftar tertentu -- dalam hal ini, paket kueri di atas adalah yang tercepat yang akan Anda dapatkan.



  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 membuat kunci utama otomatis bertambah saat memasukkan

  2. cursor.execute(INSERT INTO im_entry.test (+entrym+) VALUES ('+p+');)

  3. pg_dump database postgres dari server jauh ketika port 5432 diblokir

  4. mysql_insert_id alternatif untuk postgresql

  5. Masukkan item baru di kolom JSONB berdasarkan nilai bidang lain - postgres