Beberapa masalah menonjol:
Pertama, pertimbangkan untuk meningkatkan ke versi Postgres saat ini . Pada saat penulisan, itu adalah hal 9.6 atau hal 10 (saat ini beta). Sejak Hal 9.4 telah terjadi beberapa peningkatan untuk indeks GIN, modul tambahan pg_trgm dan data besar secara umum.
Selanjutnya, Anda membutuhkan lebih banyak RAM , khususnya work_mem
. yang lebih tinggi pengaturan. Saya tahu dari baris ini di EXPLAIN
keluaran:
Heap Blocks: exact=7625 lossy=223807
"merugi" dalam detail untuk Pemindaian Heap Bitmap (dengan nomor khusus Anda) menunjukkan kekurangan dramatis work_mem
. Postgres hanya mengumpulkan alamat blok dalam pemindaian indeks bitmap alih-alih penunjuk baris karena itu diharapkan lebih cepat dengan work_mem
rendah Anda pengaturan (tidak dapat menyimpan alamat yang tepat di RAM). Banyak lagi baris yang tidak memenuhi syarat yang harus difilter dalam Pemindaian Heap Bitmap berikut cara ini. Jawaban terkait ini memiliki detail:
Tapi jangan set work_mem
juga tinggi tanpa mempertimbangkan seluruh situasi:
Mungkin ada masalah lain, seperti indeks atau tabel mengasapi atau lebih banyak kemacetan konfigurasi. Tetapi jika Anda hanya memperbaiki dua item ini, kuerinya harus banyak sudah lebih cepat.
Juga, apakah Anda benar-benar perlu mengambil semua 40k baris dalam contoh? Anda mungkin ingin menambahkan LIMIT
small kecil ke kueri dan menjadikannya pencarian "tetangga terdekat" - dalam hal ini indeks GiST adalah pilihan yang lebih baik, karena itu seharusnya lebih cepat dengan indeks GiST. Contoh: