Saya memposting rencana permintaan Anda di explain.depesz.com, lihatlah.
Perkiraan perencana kueri sangat salah di beberapa tempat. Sudahkah Anda menjalankan ANALYZE
baru-baru ini?
Baca bab-bab dalam manual tentang Statistik yang Digunakan oleh Perencana dan Konstanta Biaya Perencana. Berikan perhatian khusus pada bab tentang random_page_cost
dan default_statistics_target
.
Anda dapat mencoba:
ALTER TABLE diplomas ALTER COLUMN number SET STATISTICS 1000;
ANALYZE diplomas;
Atau bahkan lebih tinggi untuk tabel dengan 10 juta baris. Itu tergantung pada distribusi data dan kueri yang sebenarnya . Percobaan. Standarnya adalah 100, maksimumnya adalah 10.000.
Untuk database sebesar itu, hanya 1 atau 5 MB work_mem
umumnya tidak cukup. Baca halaman Wiki Postgres di Tuning Postgres yang terhubung dengan @aleroot.
Karena kueri Anda membutuhkan 430104kB memori di disk sesuai dengan EXPLAIN
output, Anda harus mengatur work_mem
ke sesuatu seperti 500MB atau lebih untuk memungkinkan penyortiran dalam memori. Representasi data dalam memori membutuhkan lebih banyak ruang daripada representasi di disk. Anda mungkin tertarik dengan apa yang diposting Tom Lane tentang masalah itu baru-baru ini.
Meningkatkan work_mem
dengan hanya sedikit, seperti yang Anda coba, tidak akan banyak membantu atau bahkan bisa melambat. Menyetelnya ke tinggi secara global bahkan dapat merugikan, terutama dengan akses bersamaan. Beberapa sesi mungkin membuat satu sama lain kekurangan sumber daya. Mengalokasikan lebih banyak untuk satu tujuan menghilangkan memori dari yang lain jika sumber daya terbatas. Penyiapan terbaik bergantung pada situasi lengkapnya.
Untuk menghindari efek samping, setel cukup tinggi secara lokal di sesi Anda, dan sementara untuk kueri:
SET work_mem = '500MB';
Setel ulang ke default Anda setelahnya:
RESET work_mem;
Atau gunakan SET LOCAL
untuk mengaturnya hanya untuk transaksi saat ini untuk memulai.