Manfaatkan Materialized View PostgreSQL untuk Optimize Query

Sumber: www.freepik.com

Memanfaatkan Materialized View PostgreSQL untuk optimize query menjadi salah satu langkah cerdas dalam meningkatkan performa database Anda. Dalam pengelolaan data yang kompleks, query yang lambat sering menjadi tantangan utama bagi pengembang dan administrator database.

Materialized View di PostgreSQL hadir sebagai solusi efisien untuk mengoptimalkan proses query dengan menyimpan hasil query dalam bentuk tabel fisik.

Artikel ini akan membahas bagaimana Materialized View dapat membantu Anda mengurangi beban kerja database dan meningkatkan kecepatan akses data secara signifikan.

Dalam era digital yang serba cepat, kebutuhan untuk mengolah data dalam jumlah besar dengan waktu yang singkat menjadi semakin penting.

Basis data modern tidak hanya dituntut untuk menyimpan informasi dengan aman tetapi juga mampu memberikan performa maksimal dalam menjawab query yang kompleks. Salah satu solusi yang banyak digunakan untuk meningkatkan performa query adalah fitur Materialized View yang ada di postgreSQL.

Materialized View merupakan bentuk penyimpanan hasil dari query yang telah dieksekusi sebelumnya, sehingga ketika query serupa dijalankan kembali, basis data tidak perlu memproses ulang seluruh data dari awal.

Pendekatan ini sangat berguna untuk skenario seperti laporan bisnis, analitik data, atau aplikasi dengan kebutuhan read-heavy. Dengan memanfaatkan Materialized View, pengembang dapat mengurangi beban di sisi server, mempercepat waktu response atau waktu eksekusi, dan meningkatkan pengalaman pengguna secara keseluruhan.

Namun, penggunaan Materialized View juga memiliki tantangan tersendiri, seperti kebutuhan untuk menjaga konsistensi data dan menentukan frekuensi pembaruan yang optimal.

Artikel ini akan membahas bagaimana Materialized View bekerja, manfaat yang ditawarkannya, serta praktik terbaik dalam mengimplementasikannya untuk memastikan efisiensi basis data tanpa mengorbankan integritas data.

Mari kita coba berikan contoh ilustrasi supaya mudah dipahami.

Studi Kasus Pemanfaatan Materialized View PostgreSQL untuk Optimize Query

Disini kita akan coba ilustrasikan dengan contoh kasus, user ingin dibuatkan dashboard yang menampilkan data data brand kendaraan beserta dengan jumlah grup tipe nya per brand, yang ditampilkan tidak secara realtime didashboard nya.

Dalam studi kasus ini kita coba ilustrasikan dengan dua table dulu saja supaya mudah dipahami. Disini saya mempunyai dua tabel, pertama tabel mst_brand kedua tabel mst_group_type.

CREATE TABLE mst_brand (
	brand_id uuid NOT NULL,
	brand_name varchar(255) NOT null,
	CONSTRAINT mst_brand_pkey PRIMARY KEY (brand_id)
);
CREATE TABLE mst_group_type (
	group_type_id uuid NOT NULL,
	brand_id uuid NOT NULL,
	group_type_name varchar(255) NOT NULL,
	CONSTRAINT mst_group_type_pkey PRIMARY KEY (group_type_id)
);

ALTER TABLE mst_group_type ADD CONSTRAINT mst_group_type_brand_id_foreign FOREIGN KEY (brand_id) REFERENCES mst_brand(brand_id);

Masukan data sampel untuk mempermudah testing

INSERT INTO mst_brand
(brand_id, brand_name)
VALUES('01941a91-ec23-73a3-927d-607298f9ebdd'::uuid, 'Honda');
INSERT INTO mst_brand
(brand_id, brand_name)
VALUES('01941a91-ec23-73a3-927d-607298f9ebde'::uuid, 'Toyota');
INSERT INTO mst_group_type
(group_type_id, brand_id, group_type_name)
VALUES('01941a91-ec23-73a3-927d-0607298f9eb1'::uuid, '01941a91-ec23-73a3-927d-607298f9ebdd'::uuid, 'Jazz');
INSERT INTO mst_group_type
(group_type_id, brand_id, group_type_name)
VALUES('01941a91-ec23-73a3-927d-0607298f9eb2'::uuid, '01941a91-ec23-73a3-927d-607298f9ebdd'::uuid, 'BRV');
INSERT INTO mst_group_type
(group_type_id, brand_id, group_type_name)
VALUES('01941a91-ec23-73a3-927d-0607298f9eb3'::uuid, '01941a91-ec23-73a3-927d-607298f9ebde'::uuid, 'Avanza');

Lalu saya punya Query untuk menampilkan data sesuai kebutuhan user tadi seperti ini.

select
	mb.brand_name,
	count(mgt.group_type_id) as total_type
from
	mst_brand mb
inner join mst_group_type mgt on
	mgt.brand_id = mb.brand_id
group by
	mb.brand_name

Dari Query diatas bisa diliat untuk menampilkan data sesuai kebutuhan user kita memerlukan dua tabel, lalu di grouping dan di count.

Catatan
Ini hanya gambaran untuk kasus yang sederhana ya

Sekarang kita coba untuk buat Materialized View dengan nama Materialized View nya dashboard_brand.

create materialized view dashboard_brand as select
	mb.brand_name,
	count(mgt.group_type_id) as total_type
from
	mst_brand mb
inner join mst_group_type mgt on
	mgt.brand_id = mb.brand_id
group by
	mb.brand_name

Coba kita pastikan apakah Materialized View yang sudah dibuat tadi sudah ada / belum. Disini saya menggunakan aplikasi DBeaver sebagai GUI untuk database management nya.

Jika sudah ada berarti sudah berhasil di buat untuk Materialized View nya, kita coba sederhanakan Query untuk menampilkan data tadi di ubah menjadi ke Materialized View yang sudah kita buat tadi.

select brand_name, total_type from dashboard_brand

Dapat dilihat hasilnya akan sama dengan Query yang tanpa menggunakan Materialized View, lalu apa perbedaan nya ?, perbedaan nya kita tidak perlu melakukan query yang terlalu panjang dan ketika data sudah bertumbuh menjadi lebih banyak kita bisa langsung memangkas waktu eksekusi perintah SQL tersebut.

Materialized View ini memerlukan suatu perintah Query untuk melakukan refresh data, karena sesuai informasi penjelasan di awal Materialized View merupakan bentuk penyimpanan hasil dari query yang telah dieksekusi sebelumnya.

Contoh kasus saya membuat Materialized View ketika total_type untuk brand Honda saat ini hanya ada 2 data lalu beberapa saat kemudian data group_type nya bertambah untuk brand Honda menjadi 3, yang terjadi adalah di Materialized View akan tetap menampilkan 2 data, Kenapa seperti itu, karena ketika kita membuat Materialized View kondisi data nya masih 2.

Maka dari itu perlu perintah sql untuk memperbarui Materialized View nya dengan Query sebagai berikut

refresh materialized view dashboard_brand

Kekurangan dan Kelebihan Materialized View

Kekurangan

  • Tidak Otomatis Terbarui (MV tidak secara otomatis mencerminkan perubahan pada tabel sumber. Anda perlu memperbarui MV secara manual menggunakan perintah REFRESH MATERIALIZED VIEW, yang dapat memakan waktu pada dataset besar)
  • Overhead Penyimpanan (MV memakan ruang penyimpanan tambahan karena data dari query disimpan secara fisik)
  • Keterbatasan Penggunaan (MV tidak selalu cocok untuk data yang sering berubah, karena membutuhkan penyegaran terus-menerus agar data tetap terkini)
  • Tidak Bisa Diupdate Langsung (MV bersifat read-only; Anda tidak dapat mengubah datanya secara langsung. Semua perubahan harus dilakukan di tabel sumber)

Kelebihan

  • Performa Cepat (Data sudah diproses sebelumnya (precomputed), sehingga query yang menggunakan MV jauh lebih cepat dibandingkan menjalankan query kompleks secara langsung)
  • Pengurangan Beban Query Berat (Query berat yang melibatkan banyak tabel, agregasi, atau pengurutan dapat dieksekusi satu kali saat pembuatan MV, sehingga tidak perlu dieksekusi ulang setiap kali data dibutuhkan)
  • Snapshot Data (MV menyimpan snapshot data pada saat terakhir diperbarui, yang dapat bermanfaat untuk laporan historis atau analisis data tertentu)
  • Fleksibilitas Indexing (Dapat membuat indeks pada Materialized View untuk meningkatkan performa query lebih lanjut)

Bagaimana Supaya Bisa Realtime

Ada beberapa cara untuk melakukan refresh secara realtime yaitu :

  • Menggunakan Queue
  • Menggunakan Triger after insert, delete dan update

Dalam contoh ilustrasi ini saya tidak menggunakan metode untuk realtime untuk refresh datanya, jadi dilakukan oleh cronjob setiap 1 jam sekali, sehingga datanya akan terus up to date tiap jam.

Demikian penjelasan yang bisa saya sampaikan. Dalam pengelolaan database yang kompleks, performa query yang optimal adalah kunci untuk memastikan sistem berjalan dengan efisien.

Dengan memanfaatkan Materialized View PostgreSQL untuk optimize query, Anda dapat menyimpan hasil query secara fisik, mengurangi beban kerja pada database, dan mempercepat akses data.

Solusi ini sangat cocok untuk lingkungan yang membutuhkan analisis data intensif atau sistem yang berinteraksi dengan volume data besar. Dengan memanfaatkan fitur ini secara efektif, Anda tidak hanya meningkatkan performa database, tetapi juga mendukung kelancaran operasional bisnis, aplikasi dan pengolahan data Anda.

Firman
Firman

https://www.logique.co.id/blog/author/firman/

Backend enthusiast, Trying to share by writing according to experience

Related Posts

Sumber: www.freepik.com

Mengoptimalkan Kinerja Sistem dengan RabbitMQ