prehistoric.me

Refresh Materialized View Concurrently akan Merusak Urutan

Misalkan ada materialized views (di postgres) dengan definisi sebagai berikut:

SELECT word, COUNT(1) as occurrence FROM corpus GROUP BY word ORDER BY occurrence

Diharapkan kita bisa mendapatkan word dengan occurrence terbesar hanya dengan SELECT pada MV tanpa perlu melakukan ordering. Ternyata jika MV diupdate dengan REFRESH MATERIALIZED VIEW CONCURRENTLY sambil banyak terjadi pembacaan, hasilnya MV menjadi tidak lagi berurutan berdasar occurrence.

Menurut teman saya, ini terjadi karena saat refresh, baris MV yang akan diupdate masih diakses dan terkunci sehingga proses update tertunda, sementara update untuk baris lainnya sudah selesai. Saat akhirnya baris tersebut terupdate, urutan sudah tidak sesuai lagi.

Solusinya adalah proses select terhadap MV tetap harus menggunakan order. Supaya tetap cepat, perlu juga ditambahkan index pada kolom occurrence.