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
.