Topik ini menjelaskan fitur tampilan materialisasi real-time dari PolarDB for PostgreSQL.
Cakupan
PolarDB for PostgreSQL mendukung versi berikut:
PostgreSQL 14 (versi mesin minor 2.0.14.8.11.0 atau yang lebih baru)
PostgreSQL 11 (versi mesin minor 2.0.11.9.27.0 atau yang lebih baru)
Anda dapat melihat versi mesin minor di Konsol atau menjalankan pernyataan SHOW polardb_version;. Jika versi mesin minor kluster Anda tidak memenuhi persyaratan, Anda dapat melakukan upgrade versi mesin minor.
Informasi latar belakang
Berbeda dengan tampilan standar, tampilan materialisasi menyimpan hasil kueri secara langsung. Dalam skenario kueri kompleks, hal ini dapat meningkatkan efisiensi kueri secara signifikan. Namun, data dalam tampilan materialisasi tidak diperbarui secara otomatis ketika data di tabel dasarnya berubah, sehingga kueri terhadap tampilan tersebut mungkin tidak selalu mengembalikan data terbaru.
Untuk mengatasi masalah ini, PolarDB memperkenalkan tampilan materialisasi real-time. Dibandingkan dengan tampilan materialisasi standar, tampilan materialisasi real-time menawarkan manfaat berikut:
Tampilan materialisasi real-time mendukung pembaruan tingkat pernyataan. Saat Anda melakukan operasi DML seperti INSERT, DELETE, atau UPDATE pada tabel dasar, data dalam tampilan materialisasi real-time diperbarui secara otomatis setelah pernyataan selesai, sehingga menjamin konsistensi data antara tampilan dan tabel dasar.
Tampilan materialisasi real-time memanfaatkan data inkremental dari tabel dasar. Saat dilakukan refresh, kueri penuh terhadap tampilan tersebut tidak diperlukan, sehingga memberikan performa lebih baik dibandingkan refresh penuh yang sering diperlukan oleh tampilan materialisasi standar.
Tampilan materialisasi real-time dapat meningkatkan performa kueri secara signifikan sekaligus memastikan bahwa hasil kueri konsisten dengan data di tabel dasar.
Glosarium
Tabel dasar: Tabel standar yang digunakan dalam definisi tampilan materialisasi.
Delta: Kumpulan perubahan inkremental (penambahan atau penghapusan) yang terjadi pada tabel dasar.
Refresh: Operasi maintenance yang memperbarui tampilan materialisasi untuk memastikan datanya konsisten dengan data terkini di tabel dasarnya.
Apply Delta: Proses menerapkan data inkremental yang telah dihitung (delta) ke tampilan materialisasi real-time guna menjaga konsistensi data dengan tabel dasarnya.
Batasan
Batasan berikut berlaku untuk definisi tampilan materialisasi real-time:
Tabel dasar harus berupa tabel standar. Tidak boleh berupa tabel partisi atau tabel turunan (inherited table).
Hanya fungsi
IMMUTABLEyang didukung.Hanya definisi tampilan yang berisi kueri sederhana, proyeksi,
DISTINCT, dan beberapa fungsi agregat yang didukung. Definisi tampilan yang berisi kueri kompleks seperti subkueri,[NOT] EXISTS,[NOT] IN,LIMIT,HAVING,DISTINCT ON,WITH (CTE),ORDER BY, fungsi jendela,GROUPING SETS,CUBE,ROLLUP,UNION,INTERSECT, atauEXCEPTtidak didukung.Saat Anda menggunakan klausa
GROUP BY, kolom yang ditentukan dalam klausaGROUP BYjuga harus disertakan dalam proyeksi.Hanya fungsi agregat bawaan berikut yang didukung:
MIN,MAX,SUM,AVG, danCOUNT.Definisi tampilan yang berisi
INNER JOINdidukung.Definisi tampilan yang berisi
OUTER JOIN(termasukLEFT JOIN, RIGHT JOIN, dan FULL JOIN) didukung. Namun, batasan berikut berlaku:CatatanFitur ini hanya didukung untuk versi mesin minor 2.0.14.18.37.0 dan yang lebih baru.
OUTER JOINdanDISTINCTtidak dapat digunakan bersamaan.OUTER JOINdanGROUP BYtidak dapat digunakan bersamaan.OUTER JOINdan fungsi agregat tidak dapat digunakan bersamaan.Klausa
FROMtidak boleh berisiOUTER JOINsekaligus daftar tabel yang dipisahkan koma.Kueri
OUTER JOINhanya mendukung kondisi equi-join sederhana. Tidak mendukung kondisi dengan operatorAND/ORatau kondisi di mana kedua sisi equi-join merujuk ke kolom dari tabel yang sama.Jika suatu kueri berisi
OUTER JOIN, proyeksi harus mencakup semua kolom yang digunakan dalam kondisiJOIN.
Setelah membuat tampilan materialisasi real-time pada tabel dasar, batasan DDL berikut berlaku untuk tabel dasar:
Anda hanya dapat menjalankan perintah
DROP TABLEpada tabel dasar jika menentukan opsiCASCADE.Saat menjalankan perintah
ALTER TABLEpada tabel dasar, Anda tidak dapat menghapus atau mengubah kolom yang dirujuk oleh tampilan materialisasi.
Dampak performa
Tampilan materialisasi real-time secara signifikan meningkatkan performa kueri tetapi berdampak besar pada performa penulisan (write performance) tabel dasar. Gunakan tampilan materialisasi real-time dalam skenario di mana operasi baca lebih sering daripada operasi tulis.
Dampak tampilan materialisasi real-time terhadap performa penulisan tabel dasar bergantung pada faktor-faktor seperti definisi tampilan, muatan penulisan (write payloads), struktur, dan indeks tabel dasar. Sebelum membuat tampilan materialisasi real-time di lingkungan produksi, uji performa penulisan tabel dasar di lingkungan staging. Gunakan tampilan materialisasi real-time di lingkungan produksi hanya jika performa penulisan memenuhi kebutuhan Anda.
Metode berikut dapat membantu mengurangi biaya maintenance tampilan materialisasi real-time:
Hindari membuat terlalu banyak tampilan materialisasi real-time pada tabel dasar yang sama.
Tulis data ke tabel dasar secara batch. Misalnya, gunakan perintah
COPYatauINSERT INTO SELECTuntuk mengimpor data secara batch.Setiap tabel dasar harus memiliki primary key, yang harus disertakan dalam kolom proyeksi tampilan materialisasi real-time.
Cara kerjanya
Membuat tampilan materialisasi real-time
Sistem menulis ulang kueri tampilan materialisasi untuk menghitung kolom tersembunyi yang diperlukan untuk maintenance.
Pemicu (trigger) dibuat pada tabel dasar untuk mengaktifkan refresh inkremental.
Indeks unik dibuat pada tampilan materialisasi real-time saat kondisi tertentu terpenuhi guna mempercepat refresh inkremental.
Refresh inkremental tampilan materialisasi real-time
Perubahan data pada tabel dasar mengaktifkan pemicu yang sesuai.
Pemicu mengambil data inkremental dari tabel dasar.
Delta untuk tampilan materialisasi real-time dihitung berdasarkan definisinya dan data inkremental dari tabel dasar.
Delta yang dihitung diterapkan ke tampilan materialisasi real-time untuk menyelesaikan refresh inkremental.
Hapus tampilan materialisasi waktu nyata
Hapus pemicu refresh inkremental untuk tampilan materialisasi real-time dari tabel dasar.
Hapus tampilan materialisasi real-time itu sendiri.
Panduan penggunaan
Persiapan
Di database tempat Anda ingin menggunakan tampilan materialisasi real-time, buat ekstensi
polar_ivm.CREATE EXTENSION polar_ivm WITH SCHEMA pg_catalog;Membuat tampilan yang di-materialisasi secara real-time
CREATE MATERIALIZED VIEW table_name[ (column_name [, ...] ) ] REFRESH FAST ON COMMIT AS query [ WITH [ NO ] DATA ]Deskripsi parameter
Parameter
Deskripsi
table_name
Nama tampilan materialisasi real-time yang akan dibuat. Nama dapat dikualifikasi dengan skema.
column_name
Nama kolom dalam tampilan materialisasi baru. Jika Anda tidak memberikan nama kolom, nama tersebut diambil dari nama kolom output kueri.
WITH DATA
Opsi default. Langsung membuat tampilan materialisasi real-time lengkap.
WITH NO DATA
Hanya membuat struktur tampilan materialisasi real-time. Tampilan tidak berisi data dan tidak diperbarui secara real-time.
Mengkueri tampilan ini menghasilkan error hingga Anda menjalankan perintah
REFRESH MATERIALIZED VIEWpada tampilan tersebut.query
Definisi tampilan untuk tampilan materialisasi real-time. Dapat berupa perintah SELECT, TABLE, atau VALUES. Kueri ini dijalankan dalam operasi dengan pembatasan keamanan.
Refresh inkremental tampilan materialisasi real-time
REFRESH MATERIALIZED VIEW table_nameCatatanCatatan:
table_name: Nama tampilan materialisasi real-time yang akan direfresh. Nama dapat dikualifikasi dengan skema.
Refresh manual tidak diperlukan untuk tampilan materialisasi real-time yang dibuat dengan
WITH DATAkarena konsistensi data dipertahankan secara otomatis. Operasi refresh manual pada tampilan semacam ini dilewati.Saat merefresh tampilan materialisasi real-time yang dibuat dengan
WITH NO DATA, tampilan diisi dengan data berdasarkan definisinya, dan refresh real-time diaktifkan untuk perubahan selanjutnya pada tabel dasar.
Menghapus tampilan materialisasi real-time
DROP MATERIALIZED VIEW [ IF EXISTS ] table_name [, ...] [ CASCADE | RESTRICT ]Deskripsi parameter:
Parameter
Deskripsi
IF EXISTS
Tidak memunculkan error jika tampilan materialisasi real-time tidak ada. Sebaliknya, notifikasi diberikan.
table_name
Nama tampilan materialisasi real-time yang akan dihapus. Nama dapat dikualifikasi dengan skema.
CASCADE
Secara otomatis menghapus objek yang bergantung pada tampilan materialisasi real-time, seperti tampilan materialisasi lain atau tampilan reguler, dan kemudian semua objek yang bergantung pada objek tersebut.
RESTRICT
Menolak penghapusan jika ada objek yang bergantung pada tampilan materialisasi real-time. Ini adalah nilai default.
Contoh
Tampilan materialisasi real-time dengan fungsi agregat
Buat ekstensi yang diperlukan untuk tampilan materialisasi real-time.
CREATE EXTENSION IF NOT EXISTS polar_ivm WITH SCHEMA pg_catalog ;Buat tabel dasar dan impor data awal.
CREATE TABLE t( a INT, b VARCHAR); INSERT INTO t VALUES (1,'a'), (2,'b'), (3,'c'), (4,'d'), (5,'e');Buat tampilan material real-time.
CREATE MATERIALIZED VIEW mv REFRESH FAST ON COMMIT AS SELECT max(a),min(a),b FROM t GROUP BY b;Lakukan operasi DML pada tabel dasar.
Kueri data dalam tampilan materialisasi real-time.
SELECT * FROM mv ORDER BY b;Hasil berikut dikembalikan:
max | min | b -----+-----+--- 1 | 1 | a 2 | 2 | b 3 | 3 | c 4 | 4 | d 5 | 5 | e (5 rows)Hasil menunjukkan bahwa data dalam tampilan materialisasi real-time konsisten dengan data di tabel dasar.
Masukkan data baru ke tabel dasar, lalu kueri data dalam tampilan materialisasi real-time.
INSERT INTO t VALUES(6,'f'); SELECT * FROM mv ORDER BY b;Hasil berikut dikembalikan:
max | min | b -----+-----+--- 1 | 1 | a 2 | 2 | b 3 | 3 | c 4 | 4 | d 5 | 5 | e 6 | 6 | f (6 rows)Hasil menunjukkan bahwa data dalam tampilan materialisasi real-time konsisten dengan data di tabel dasar.
Hapus data dari tabel dasar, lalu kueri data dalam tampilan materialisasi real-time.
DELETE FROM t WHERE a = 2; SELECT * FROM mv ORDER BY b;Hasil berikut dikembalikan:
max | min | b -----+-----+--- 1 | 1 | a 3 | 3 | c 4 | 4 | d 5 | 5 | e 6 | 6 | f (5 rows)Hasil menunjukkan bahwa data dalam tampilan materialisasi real-time konsisten dengan data di tabel dasar.
Perbarui data di tabel dasar, lalu kueri data dalam tampilan materialisasi real-time.
UPDATE t SET a = a + 1; SELECT * FROM mv ORDER BY b;Hasil berikut dikembalikan:
max | min | b -----+-----+--- 2 | 2 | a 4 | 4 | c 5 | 5 | d 6 | 6 | e 7 | 7 | f (5 rows)Hasil menunjukkan bahwa data dalam tampilan materialisasi real-time konsisten dengan data di tabel dasar.
Hapus tampilan material real-time.
DROP MATERIALIZED VIEW mv;
Tampilan materialisasi real-time dengan OUTER JOIN
Fitur ini hanya didukung untuk versi mesin minor 2.0.14.18.37.0 dan yang lebih baru.
Buat ekstensi yang diperlukan untuk tampilan materialisasi real-time.
CREATE EXTENSION IF NOT EXISTS polar_ivm WITH SCHEMA pg_catalog;Buat tabel dasar dan impor data awal.
CREATE TABLE t1(a INT, b VARCHAR); INSERT INTO t1 VALUES (1,'a'), (2,'b'), (3,'c'), (4,'d'), (5,'e'); CREATE TABLE t2(a INT, c VARCHAR); INSERT INTO t2 VALUES (1,'e'), (2,'f');Buat tampilan materialisasi real-time.
CREATE MATERIALIZED VIEW mv REFRESH FAST ON COMMIT AS SELECT t1.a as t1a, t1.b, t2.a as t2a, t2.c FROM t1 LEFT JOIN t2 ON t1.a = t2.a;Lakukan operasi DML pada tabel dasar.
Kueri data dalam tampilan materialisasi real-time.
SELECT * FROM mv ORDER BY b;Hasil berikut dikembalikan:
t1a | b | t2a | c -----+---+-----+--- 1 | a | 1 | e 2 | b | 2 | f 3 | c | | 4 | d | | 5 | e | |Hasil menunjukkan bahwa data dalam tampilan materialisasi real-time konsisten dengan data di tabel dasar.
Masukkan data baru ke tabel dasar, lalu kueri data dalam tampilan materialisasi real-time.
INSERT INTO t2 VALUES(3,'g'); SELECT * FROM mv ORDER BY b;Hasil berikut dikembalikan:
t1a | b | t2a | c -----+---+-----+--- 1 | a | 1 | e 2 | b | 2 | f 3 | c | 3 | g 4 | d | | 5 | e | |Hasil menunjukkan bahwa data dalam tampilan materialisasi real-time konsisten dengan data di tabel dasar.
Hapus data dari tabel dasar, lalu kueri data dalam tampilan materialisasi real-time.
DELETE FROM t1 WHERE a in (1, 4); SELECT * FROM mv ORDER BY b;Hasil berikut dikembalikan:
t1a | b | t2a | c -----+---+-----+--- 2 | b | 2 | f 3 | c | 3 | g 5 | e | |Hasil menunjukkan bahwa data dalam tampilan materialisasi real-time konsisten dengan data di tabel dasar.
Perbarui data di tabel dasar, lalu kueri data dalam tampilan materialisasi real-time.
UPDATE t2 SET a = a + 1; SELECT * FROM mv ORDER BY b;Hasil berikut dikembalikan:
t1a | b | t2a | c -----+---+-----+--- 2 | b | 2 | e 3 | c | 3 | f 5 | e | |Hasil menunjukkan bahwa data dalam tampilan materialisasi real-time konsisten dengan data di tabel dasar.
Hapus tampilan materialisasi real-time.
DROP MATERIALIZED VIEW mv;