Meningkatkan work_mem tampaknya membuat pengurutan sekitar 8 kali lebih cepat:(172639.670 - 169311.063) / (167975.549 - 167570.669)
. Tetapi karena pengurutan hanya mengambil sebagian kecil dari keseluruhan waktu eksekusi, membuatnya bahkan 1000 kali lebih cepat tidak dapat membuat segalanya jauh lebih baik secara keseluruhan. Pemindaian seqlah yang memakan waktu.
Sebagian besar waktu dalam pemindaian seq mungkin dihabiskan untuk IO. Anda dapat melihat dengan menjalankan EXPLAIN (ANALYZE, BUFFERS)
setelah mengaktifkan track_io_timing.
Juga, memparalelkan pemindaian seq seringkali tidak terlalu membantu, karena sistem IO biasanya mampu mengirimkan kapasitas penuhnya ke satu pembaca, karena keajaiban readahead. Dan terkadang pembaca paralel bahkan dapat saling menginjak, membuat keseluruhan kinerja menjadi lebih buruk. Anda dapat menonaktifkan paralelisasi dengan set max_parallel_workers_per_gather TO 0;
Ini mungkin membuat segalanya lebih cepat, dan jika tidak, setidaknya akan membuat rencana EXPLAIN lebih mudah dipahami.
Anda mengambil lebih dari 3% tabel:193963 / (193963 + 6041677)
. Indeks mungkin tidak terlalu membantu saat Anda mengambil begitu banyak. Jika memang demikian, Anda akan menginginkan indeks gabungan, bukan indeks individual. Jadi Anda ingin indeks pada (client, event_name, date(datetime))
. Maka Anda juga perlu mengubah kueri untuk menggunakan date(datetime)
daripada to_char(datetime, 'YYYY-MM-DD')
. Anda perlu melakukan perubahan ini karena to_char tidak dapat diubah, sehingga tidak dapat diindeks.