All Products
Search
Document Center

PolarDB:Real-time materialized views

Last Updated:Aug 25, 2026

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)

Catatan

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 IMMUTABLE yang 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, atau EXCEPT tidak didukung.

  • Saat Anda menggunakan klausa GROUP BY, kolom yang ditentukan dalam klausa GROUP BY juga harus disertakan dalam proyeksi.

  • Hanya fungsi agregat bawaan berikut yang didukung: MIN, MAX, SUM, AVG, dan COUNT.

  • Definisi tampilan yang berisi INNER JOIN didukung.

  • Definisi tampilan yang mencakup OUTER JOIN (termasuk LEFT JOIN, RIGHT JOIN, dan FULL JOIN) didukung, dengan batasan berikut:

    Catatan

    Fitur ini hanya didukung untuk versi mesin minor 2.0.14.18.37.0 atau lebih baru.

    • OUTER JOIN dan DISTINCT tidak dapat digunakan bersamaan.

    • OUTER JOIN dan GROUP BY tidak dapat digunakan bersamaan.

    • OUTER JOIN dan fungsi agregat tidak dapat digunakan bersamaan.

    • Klausa FROM tidak boleh berisi OUTER JOIN sekaligus daftar tabel yang dipisahkan koma.

    • Kueri OUTER JOIN hanya mendukung kondisi equi-join sederhana. Tidak mendukung kondisi dengan operator AND/OR atau 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 kondisi JOIN.

    Setelah Anda membuat real-time materialized view pada tabel dasar, batasan DDL berikut berlaku untuk tabel dasar:

    • Anda hanya dapat menjalankan perintah DROP TABLE pada tabel dasar jika menentukan opsi CASCADE.

    • Saat menjalankan perintah ALTER TABLE pada 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 COPY atau INSERT INTO SELECT untuk 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 VIEW pada 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_name
    Catatan

    Catatan:

    • 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 DATA karena 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

  1. Buat ekstensi yang diperlukan untuk real-time materialized views.

    CREATE EXTENSION IF NOT EXISTS polar_ivm WITH SCHEMA pg_catalog ;
  2. 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');
  3. 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;
  4. 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.

  5. Hapus real-time materialized view.

    DROP MATERIALIZED VIEW mv;

Real-time materialized view dengan OUTER JOIN

Catatan

Fitur ini hanya didukung untuk versi mesin minor 2.0.14.18.37.0 atau lebih baru.

  1. Buat ekstensi yang diperlukan untuk real-time materialized views.

    CREATE EXTENSION IF NOT EXISTS polar_ivm WITH SCHEMA pg_catalog;
  2. 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');
  3. 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;
  4. 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.

  5. Hapus real-time materialized view.

    DROP MATERIALIZED VIEW mv;