Kueri ini tidak menghasilkan I/O disk apa pun – semua blok dibaca dari buffer bersama. Tetapi karena kueri membaca 73424 blok (sekitar 574 MB), kueri akan menghasilkan beban I/O yang substansial saat tabel tidak di-cache.
Tapi ada dua hal yang bisa diperbaiki.
-
Anda memiliki kecocokan blok yang kalah dalam pemindaian tumpukan. Artinya
work_mem
tidak cukup besar untuk memuat bitmap dengan bit per baris tabel, dan 26592 bit memetakan blok tabel sebagai gantinya. Semua baris harus diperiksa ulang, dan 86733 baris dibuang, sebagian besar merupakan hasil positif palsu dari kecocokan blok lossy.Jika Anda meningkatkan
work_mem
, bitmap dengan bit per baris tabel akan masuk ke memori, dan jumlah ini akan menyusut, mengurangi pekerjaan selama pemindaian heap. -
190108 baris dibuang karena tidak cocok dengan kondisi filter tambahan dalam pemindaian heap bitmap. Ini mungkin di mana sebagian besar waktu dihabiskan. Jika Anda dapat mengurangi jumlah itu, Anda akan menang.
Indeks yang ideal untuk kueri ini adalah:
CREATE INDEX ON map_listing(transaction_type, la); CREATE INDEX ON map_listing(transaction_type, lo);
Jika
transaction_type
tidak terlalu selektif (yaitu, sebagian besar baris memiliki nilaiSale
), Anda dapat menghilangkan kolom tersebut.
EDIT:
Pemeriksaan vmstat
dan iostat
menunjukkan bahwa baik CPU dan subsistem I/O mengalami kelebihan beban yang sangat besar:semua sumber daya CPU dihabiskan untuk menunggu I/O dan VM mencuri waktu. Anda memerlukan sistem I/O yang lebih baik dan sistem host dengan lebih banyak sumber daya CPU gratis. Meningkatkan RAM mungkin mengurangi masalah I/O, tetapi hanya untuk pembacaan disk.