Topik ini menjelaskan fitur real-time materialized view dari PolarDB for PostgreSQL.
Cakupan
PolarDB for PostgreSQL mendukung versi berikut:
PostgreSQL 14 (versi mesin minor 2.0.14.8.11.0 atau lebih baru)
PostgreSQL 11 (versi mesin minor 2.0.11.9.27.0 atau 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 yang di-materialisasi menyimpan hasil kueri secara langsung. Dalam skenario kueri kompleks, hal ini dapat secara signifikan meningkatkan efisiensi kueri. Namun, data dalam tampilan yang di-materialisasi tidak diperbarui secara otomatis ketika data dalam tabel dasarnya berubah. Artinya, kueri terhadap tampilan yang di-materialisasi mungkin tidak selalu mengembalikan data terbaru.
Untuk mengatasi masalah ini, PolarDB memperkenalkan real-time materialized views. Dibandingkan dengan tampilan yang di-materialisasi standar, real-time materialized views menawarkan manfaat berikut:
Real-time materialized views mendukung pembaruan tingkat pernyataan. Saat Anda melakukan operasi DML, seperti INSERT, DELETE, atau UPDATE, pada tabel dasar, data dalam real-time materialized view diperbarui secara otomatis setelah pernyataan selesai. Hal ini memastikan konsistensi data antara real-time materialized view dan tabel dasar.
Real-time materialized views memanfaatkan data inkremental dari tabel dasar. Saat Anda merefresh real-time materialized view, kueri penuh terhadap tampilan tersebut tidak diperlukan. Hal ini memberikan performa lebih baik dibandingkan refresh penuh yang sering diperlukan oleh tampilan yang di-materialisasi standar.
Real-time materialized views dapat secara signifikan meningkatkan performa kueri sekaligus memastikan hasil kueri konsisten dengan data dalam tabel dasar.
Glosarium
Tabel dasar: Tabel standar yang digunakan dalam definisi tampilan yang di-materialisasi.
Delta: Kumpulan perubahan inkremental (penambahan atau penghapusan) yang terjadi pada tabel dasar.
Refresh: Operasi maintenance yang memperbarui tampilan yang di-materialisasi untuk memastikan datanya konsisten dengan data terkini dalam tabel dasarnya.
Apply Delta: Proses menerapkan data inkremental yang telah dihitung (delta) ke real-time materialized view guna menjaga konsistensi data dengan tabel dasarnya.
Batasan
Batasan berikut berlaku untuk definisi tampilan real-time materialized views:
Tabel dasar harus merupakan tabel standar. Tidak boleh berupa tabel partisi atau tabel turunan.
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, window functions,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 mencakup
OUTER JOIN(termasukLEFT JOIN, RIGHT JOIN, dan FULL JOIN) didukung, dengan batasan berikut:CatatanFitur ini hanya didukung untuk versi mesin minor 2.0.14.18.37.0 atau 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 kueri berisi
OUTER JOIN, proyeksi harus mencakup semua kolom yang digunakan dalam kondisiJOIN.
Setelah Anda membuat real-time materialized view 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 yang di-materialisasi.
Dampak performa
Real-time materialized views secara signifikan meningkatkan performa kueri tetapi berdampak signifikan pada performa write tabel dasar. Gunakan real-time materialized views dalam skenario di mana operasi read lebih sering daripada operasi write.
Dampak real-time materialized views terhadap performa write tabel dasar bergantung pada faktor-faktor seperti definisi tampilan, muatan write, struktur, dan indeks tabel dasar. Sebelum membuat real-time materialized views di lingkungan produksi, uji performa write tabel dasar di lingkungan staging. Gunakan real-time materialized views di lingkungan produksi hanya jika performa write memenuhi kebutuhan Anda.
Metode berikut dapat membantu mengurangi biaya maintenance real-time materialized views:
Hindari membuat terlalu banyak real-time materialized views 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 memiliki primary key, yang harus disertakan dalam kolom proyeksi real-time materialized view.
Cara kerja
Buat tampilan yang di-materialisasi secara real-time
Sistem menulis ulang kueri tampilan yang di-materialisasi untuk menghitung kolom tersembunyi yang diperlukan untuk maintenance.
Pemicu dibuat pada tabel dasar untuk mengaktifkan refresh inkremental.
Indeks unik dibuat pada real-time materialized view saat kondisi tertentu terpenuhi guna mempercepat refresh inkremental.
Merefresh real-time materialized view secara inkremental
Perubahan data pada tabel dasar mengaktifkan pemicu yang sesuai.
Pemicu mengambil data inkremental dari tabel dasar.
Delta untuk real-time materialized view dihitung berdasarkan definisinya dan data inkremental dari tabel dasar.
Delta yang dihitung diterapkan ke real-time materialized view untuk menyelesaikan refresh inkremental.
Hapus tampilan materialisasi waktu nyata
Hapus pemicu refresh inkremental untuk real-time materialized view dari tabel dasar.
Hapus real-time materialized view itu sendiri.
Panduan penggunaan
Persiapan
Di database tempat Anda ingin menggunakan real-time materialized views, buat ekstensi
polar_ivm.CREATE EXTENSION polar_ivm WITH SCHEMA pg_catalog;Buat 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 real-time materialized view yang akan dibuat. Nama dapat dikualifikasi dengan schema.
column_name
Nama kolom dalam tampilan yang di-materialisasi baru. Jika Anda tidak memberikan nama kolom, nama tersebut diambil dari nama kolom output kueri.
WITH DATA
Pilihan default. Langsung membuat real-time materialized view lengkap.
WITH NO DATA
Membuat hanya struktur real-time materialized view. Tampilan tidak berisi data dan tidak diperbarui secara real time.
Mengkueri tampilan ini mengembalikan error hingga Anda menjalankan perintah
REFRESH MATERIALIZED VIEWpada tampilan tersebut.query
Definisi tampilan untuk real-time materialized view. Dapat berupa perintah SELECT, TABLE, atau VALUES. Kueri ini dijalankan dalam operasi yang dibatasi keamanan.
Merefresh real-time materialized view secara inkremental
REFRESH MATERIALIZED VIEW table_nameCatatanCatatan:
table_name: Nama real-time materialized view yang akan direfresh. Nama dapat dikualifikasi dengan schema.
Refresh manual tidak diperlukan untuk real-time materialized view yang dibuat dengan
WITH DATAkarena konsistensi data dipertahankan secara otomatis. Operasi refresh manual pada tampilan semacam ini dilewati.Saat Anda merefresh real-time materialized view yang dibuat dengan
WITH NO DATA, tampilan diisi dengan data berdasarkan definisinya, dan refresh real time diaktifkan untuk perubahan selanjutnya pada tabel dasar.
Hapus tampilan yang di-materialisasi real-time
DROP MATERIALIZED VIEW [ IF EXISTS ] table_name [, ...] [ CASCADE | RESTRICT ]Deskripsi parameter:
Parameter
Deskripsi
IF EXISTS
Tidak melemparkan error jika real-time materialized view tidak ada. Sebagai gantinya, pemberitahuan dikeluarkan.
table_name
Nama real-time materialized view yang akan dihapus. Nama dapat dikualifikasi dengan schema.
CASCADE
Secara otomatis menghapus objek yang bergantung pada real-time materialized view, seperti tampilan yang di-materialisasi lain atau tampilan biasa, lalu semua objek yang bergantung pada objek tersebut.
RESTRICT
Menolak penghapusan jika ada objek yang bergantung pada real-time materialized view. Ini adalah nilai default.
Contoh
Real-time materialized view dengan fungsi agregat
Buat ekstensi yang diperlukan untuk real-time materialized views.
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 real-time materialized view.
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 real-time materialized view.
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 real-time materialized view konsisten dengan data dalam tabel dasar.
Masukkan data baru ke tabel dasar, lalu kueri data dalam real-time materialized view.
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 real-time materialized view konsisten dengan data dalam tabel dasar.
Hapus data dari tabel dasar, lalu kueri data dalam real-time materialized view.
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 real-time materialized view konsisten dengan data dalam tabel dasar.
Perbarui data dalam tabel dasar, lalu kueri data dalam real-time materialized view.
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 real-time materialized view konsisten dengan data dalam tabel dasar.
Hapus real-time materialized view.
DROP MATERIALIZED VIEW mv;
Real-time materialized view dengan OUTER JOIN
Fitur ini hanya didukung untuk versi mesin minor 2.0.14.18.37.0 atau lebih baru.
Buat ekstensi yang diperlukan untuk real-time materialized views.
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 real-time materialized view.
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 real-time materialized view.
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 real-time materialized view konsisten dengan data dalam tabel dasar.
Masukkan data baru ke tabel dasar, lalu kueri data dalam real-time materialized view.
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 real-time materialized view konsisten dengan data dalam tabel dasar.
Hapus data dari tabel dasar, lalu kueri data dalam real-time materialized view.
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 real-time materialized view konsisten dengan data dalam tabel dasar.
Perbarui data dalam tabel dasar, lalu kueri data dalam real-time materialized view.
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 real-time materialized view konsisten dengan data dalam tabel dasar.
Hapus real-time materialized view.
DROP MATERIALIZED VIEW mv;