Bila Hendak Guna Postgres Materialized Views (MV) ? Bahagian 2
Samakah performance View and Materialized Views ?
Dalam rencana yang lepas kita mengenai bezakan cara membina views and materialized view (MV) dan apakah perbezaannya secara dasar
Bila Hendak Guna Postgres Materialized Views (MV) ? Bahagian 1
Sebenarnya jarang sekali saya pakai Materialized View dalam kerjaya saya jika dibandingkan dengan View. Dalam rencana ini saya jelaskan kenapa ia berlaku.
Rencana kali ini pula kita cuba mengali lagi perbezaan antara kedua-dua objek ini dari segi performance pula. Dalam rencana lepas, saya telah menunjukkan perbezaan antara data jika berlaku penambahan data pada table asal.
Berdasarkan maklumat ini, mari kita lihat bagaimana query plan jika kita run query yang sama.
Gunakan insert SQL fail ini untuk mendapatkan hasil explain plan yang Github
Query daripada View
DISCARD ALL;
select * from menu_indian where harga_menu >= 4;
Dan ini adalah execution plannya
SEQ_SCAN (Seq Scan) table: menu; 6744 6696 2681.3 25.803 0.0 0.087 Parallel Aware = false;
Async Capable = false;
Alias = menu;
Plan Width = 62;
Actual Loops = 1;
Filter = ((harga_menu >= '4'::numeric) AND ((kategori_menu)::text = 'Indian'::text));
Rows Removed by Filter = 93391;
Query daripada MV
DISCARD ALL;
select * from mv_menu_indian where harga_menu >= 4;
Dan ini adalah execution plannya
SEQ_SCAN (Seq Scan) table: mv_menu_indian; 6703 6696 241.69 7.533 0.0 0.206 Parallel Aware = false;
Async Capable = false;
Alias = mv_menu_indian;
Plan Width = 60;
Actual Loops = 1;
Filter = (harga_menu >= '4'::numeric);
Rows Removed by Filter = 3359;
Daripada contoh ini kita dapat melihat jika kita menggunakan View, semua row akan discan (Jumlah Rows: 100087). Manakala untuk MV hanya 10055 jumlah rows discan.
Daripada ini kita dapat melihat performance yang lebih baik daripada MV.
Jadi lebih baik pakai MV kan?
Sebenarnya ada perkara lain yang perlu difikirkan seperti penyelengaraan objek (maintainability) and data penyegaran data.
Menggunakan View dapat memberikan anda flexibility untuk mendapatkan data yang yang terkini tanpa perlu refresh data tersebut secara berkala tetapi terpaksa berkorban dengan performance. Manakala penggunaan VM dapat memberikan anda performance query yang lebih baik tetapi anda perlu refresh data dan ia memakan masa untuk refresh data.
Berdasarkan pengalaman saya, selalunya saya akan memulakan objek View
terlebih dahulu untuk memahami keperluan data. Dan apabila performance mula menjadi isu barulah MV
akan menjadi pilihan kerana kita sudah memahami data tersebut dengan baik. Dan kita dapat menentukan kadar refresh dengan lebih tepat.
Selamat mencuba!