All Products
Search
Document Center

PolarDB:Tampilan materialisasi bertahap

Last Updated:Jun 04, 2026

Tampilan materialisasi bertahap (Incremental Materialized View/IVM) merupakan bentuk lanjutan dari tampilan materialisasi. Berbeda dengan pembaruan penuh (full refresh) yang menghitung ulang seluruh kueri, pembaruan bertahap hanya menerapkan perubahan data (INSERT, UPDATE, dan DELETE) dari tabel dasar ke tampilan tersebut. Proses yang hampir real-time ini secara signifikan mengurangi beban sistem dan latensi data.

Cara kerja

Prinsip inti tampilan materialisasi bertahap adalah memproses hanya data yang berubah, bukan seluruh set data.

Ketika operasi INSERT, UPDATE, atau DELETE terjadi pada tabel dasar, sistem secara otomatis mencatat perubahan tersebut. Proses ini berjalan secara efisien pada node penyimpanan kolom In-Memory Columnar Index (IMCI), tanpa memerlukan binlog atau trigger, serta tidak mengunci tabel dasar.

  • FAST (incremental refresh): Memproses hanya data yang berubah sejak pembaruan terakhir, sehingga menghasilkan kecepatan tinggi dan overhead rendah.

  • COMPLETE (full refresh): Menghitung ulang seluruh kueri. Cocok untuk pengisian data awal atau koreksi data.

Prasyarat

Untuk menggunakan tampilan materialisasi bertahap, sistem Anda harus memenuhi persyaratan berikut:

  • Kluster: Kluster PolarDB for MySQL Anda harus memenuhi salah satu persyaratan berikut:

    • MySQL 8.0.2 dengan versi kernel minor 8.0.2.2.35 atau lebih baru.

  • Parameter In-Memory Columnar Index (IMCI):

    Parameter

    Default

    Nilai

    Deskripsi

    imci_enable_window_function

    2

    >= 2

    Mengaktifkan dukungan untuk fungsi jendela IMCI.

    imci_enable_nci_async_pre_commit

    OFF

    OFF

    Menonaktifkan NCI async pre-commit untuk memastikan konsistensi data bertahap.

    Catatan

    Parameter ini secara default bernilai OFF dan saat ini tidak dapat diubah.

    imci_enable_hybrid_plan

    ON

    OFF

    Menonaktifkan rencana eksekusi hibrida untuk memaksa pembaruan bertahap dieksekusi pada node penyimpanan kolom read-only.

    Catatan

    Anda dapat mengubah parameter-parameter ini di PolarDB console.

Manfaat utama

Manfaat

Deskripsi

Sinkronisasi data berlatensi rendah

Menjaga data tampilan tetap sinkron dengan tabel dasar dengan latensi minimal, mengurangi waktu refresh dari menit menjadi detik bahkan milidetik. Menghindari pemindaian tabel penuh dengan hanya memproses perubahan bertahap.

Beban sistem berkurang

Secara signifikan mengurangi konsumsi CPU, memori, dan I/O. Manfaat ini terutama terasa dalam skenario dengan tabel dasar besar namun volume perubahan kecil.

Pemanfaatan IMCI yang mulus

Komputasi bertahap berjalan pada node penyimpanan kolom IMCI, memanfaatkan sepenuhnya kemampuan agregasi berkecepatan tinggi dari penyimpanan kolom.

Akselerasi kueri analitis

Memberikan waktu respons tingkat milidetik untuk kueri agregasi dan join kompleks dalam skenario HTAP (Hybrid Transactional/Analytical Processing).

Pemeliharaan latar belakang otomatis

Sistem secara otomatis mengelola siklus hidup log bertahap (tabel delta).

Kasus penggunaan

  • Pra-komputasi untuk analisis: Pra-proses join multi-tabel kompleks menjadi tabel lebar untuk menghindari operasi join mahal pada setiap kueri.

  • Akselerasi laporan: Menyediakan data pra-komputasi untuk laporan gudang data atau BI real-time, mengurangi overhead pembaruan lebih dari 90% dengan pembaruan bertahap.

  • Penggunaan ulang komputasi: Gunakan kembali hasil komputasi dengan membuat tampilan materialisasi bersarang.

  • Gudang data real-time: Mendukung kueri analitis yang mencerminkan perubahan tabel dasar hampir secara real-time.

  • Beban kerja HTAP: Menyinkronkan data OLTP yang sering diperbarui ke tampilan analitis dengan latensi rendah, memisahkan beban kerja TP dan AP.

Batasan

  • Batasan umum:

    • Sintaksis yang tidak didukung: Pembaruan bertahap tidak didukung untuk kueri yang mengandung subkueri, UNION, ORDER BY, LIMIT, fungsi jendela, HAVING, ROLLUP, atau CTE.

    • UNION ALL: Saat ini tidak didukung.

    • Persyaratan tabel dasar:

      • Tabel dasar harus memiliki IMCI aktif (polar_enable_imci = ON), dan semua kolom dalam tabel dasar harus disertakan dalam IMCI.

      • Tabel dasar tidak boleh berupa tampilan standar atau tampilan materialisasi non-bertahap. Tampilan materialisasi bersarang diperbolehkan, asalkan tampilan dalamnya juga mendukung pembaruan bertahap.

    • Overhead penyimpanan:

      • Tampilan materialisasi menyimpan salinan data, yang mengonsumsi ruang penyimpanan tambahan.

      • Sistem juga mengonsumsi penyimpanan tambahan untuk mencatat perubahan guna pembaruan bertahap. Penggunaan penyimpanan ini tidak bertambah tanpa batas karena data usang secara berkala diklaim kembali.

  • Batasan untuk filter satu tabel:

    • Tabel dasar harus memiliki primary key eksplisit.

    • Kata kunci DISTINCT tidak didukung.

  • Batasan untuk agregasi satu tabel:

    • Tabel dasar harus memiliki primary key eksplisit.

    • Klausa GROUP BY harus mereferensikan kolom tunggal dan tidak boleh menggunakan ekspresi. Misalnya, GROUP BY YEAR(create_time) tidak didukung; Anda harus mengubahnya menjadi GROUP BY create_year.

    • Fungsi agregat yang didukung: COUNT, SUM, dan AVG.

    • Fungsi agregat yang tidak didukung: STDDEV, VARIANCE, MIN, dan MAX.

    • Agregasi tanpa klausa GROUP BY saat ini tidak didukung.

    • Agregasi multi-tabel saat ini tidak didukung.

  • Batasan untuk join multi-tabel

    • Semua tabel dasar harus memiliki primary key eksplisit.

    • RIGHT JOIN tidak didukung.

    • Join harus mengikuti struktur pohon left-deep. Struktur bersarang seperti A JOIN (B LEFT JOIN C) JOIN D tidak diperbolehkan.

    • Kondisi ON untuk setiap tabel harus menyertakan kolom dari tabel lain. Sintaksis seperti A JOIN B ON B.id = 1 tidak diperbolehkan.

Sintaksis

CREATE MATERIALIZED VIEW mv_name
  [REFRESH [COMPLETE | FAST] [ON DEMAND]]
  [START WITH now()] [NEXT now() + interval 5 second]
  AS SELECT ... FROM base_table;
  • FAST: Menentukan mode pembaruan bertahap, yang hanya memproses perubahan dari tabel dasar.

  • COMPLETE: Menentukan mode pembaruan penuh, yang menghitung ulang seluruh kueri setiap kali.

  • ON DEMAND: Menentukan pembaruan berdasarkan permintaan, yang harus dipicu secara manual atau oleh interval pembaruan latar belakang yang telah ditentukan.

Contoh

Contoh 1: Filter satu tabel (tipe FILTER)

  1. Buat tabel dasar dengan indeks kolom diaktifkan.

    CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, c3 INT) COMMENT 'COLUMNAR=1';
    
    INSERT INTO t1 VALUES (1, 1, 1);
  2. Buat tampilan materialisasi bertahap.

    CREATE MATERIALIZED VIEW mv_filter REFRESH FAST ON DEMAND AS
      SELECT * FROM t1 WHERE c2 < 5;

    Lakukan pembaruan penuh untuk mengisi data awal.

    REFRESH MATERIALIZED VIEW mv_filter;
  3. Lakukan pembaruan bertahap setelah data tabel dasar berubah.

    -- Ubah tabel dasar
    INSERT INTO t1 VALUES (2, 2, 3);
    DELETE FROM t1 WHERE c1 = 1;
    
    -- Lakukan pembaruan bertahap untuk memproses hanya perubahan di atas
    REFRESH MATERIALIZED VIEW mv_filter;

Contoh 2: Statistik agregasi (tipe AGGREGATE)

-- Buat tabel dasar dengan indeks kolom diaktifkan
CREATE TABLE orders (
    order_id INT PRIMARY KEY,                  -- ID pesanan unik (primary key)
    user_id INT NOT NULL,                      -- ID pengguna (kolom GROUP BY)
    amount DECIMAL(12, 2) NOT NULL,            -- Jumlah pesanan (kolom agregasi)
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Waktu pesanan (bidang bisnis standar)
)COMMENT 'COLUMNAR=1';

-- Statistik agregasi
CREATE MATERIALIZED VIEW mv_user_order_stats
  REFRESH FAST ON DEMAND
  AS SELECT
       user_id,
       COUNT(*)                   AS order_count,
       SUM(amount * 2)            AS total_amount,
       AVG(CAST(amount AS INT))   AS avg_amount
     FROM orders
     GROUP BY user_id;

Fungsi agregat yang didukung: COUNT(*), COUNT(expr), SUM(expr), dan AVG(expr).

Contoh 3: INNER JOIN multi-tabel

  1. Buat tabel dasar.

    CREATE TABLE t4 (id4 INT PRIMARY KEY, c2 INT, c3 VARCHAR(50)) COMMENT 'COLUMNAR=1';
    CREATE TABLE t5 (id5 INT PRIMARY KEY, c2 INT, c3 VARCHAR(50)) COMMENT 'COLUMNAR=1';
    CREATE TABLE t6 (id6 INT PRIMARY KEY, c2 INT, c3 VARCHAR(50)) COMMENT 'COLUMNAR=1';
    
    INSERT INTO t4 VALUES (1, 10, 'A'), (2, 20, 'B'), (3, 30, 'C');
    INSERT INTO t5 VALUES (1, 100, 'X'), (2, 200, 'Y'), (4, 400, 'Z');
    INSERT INTO t6 VALUES (1, 1000, 'P'), (2, 2000, 'Q'), (3, 3000, 'R');

    Buat tampilan materialisasi bertahap untuk INNER JOIN multi-tabel.

    CREATE MATERIALIZED VIEW mv_inner_with_where_on REFRESH FAST ON DEMAND AS
      SELECT t4.id4, t4.c2, t5.id5, t5.c2 AS t5_c2, t6.id6, t6.c2 AS t6_c2
      FROM t4
      INNER JOIN t5 ON t4.id4 = t5.id5
      INNER JOIN t6 ON t4.id4 = t6.id6
      WHERE t4.c2 > 5 AND t5.c2 > 50;
  2. Lakukan pembaruan penuh dan verifikasi.

    -- Lakukan pembaruan penuh untuk mengisi data awal
    REFRESH MATERIALIZED VIEW mv_inner_with_where_on;
    
    -- Ubah tabel dasar
    INSERT INTO t4 VALUES (4, 40, 'D');
    INSERT INTO t6 VALUES (4, 4000, 'S');
    UPDATE t4 SET c2 = 15 WHERE id4 = 1;
    DELETE FROM t5 WHERE id5 = 4;
    INSERT INTO t5 VALUES (5, 400, 'W');
    
    -- Lakukan pembaruan bertahap
    REFRESH MATERIALIZED VIEW mv_inner_with_where_on;

Contoh 4: LEFT JOIN

-- Buat tabel dasar dengan indeks kolom diaktifkan
-- Buat tabel produk (tabel yang digabungkan / tabel kanan)
CREATE TABLE products (
    product_id INT PRIMARY KEY,                -- Kunci join, harus primary key
    product_name VARCHAR(100) NOT NULL,        -- Nama produk
    price DECIMAL(10, 2)                       -- Bidang bisnis lainnya
) COMMENT 'COLUMNAR=1';                       

-- Buat tabel item pesanan (tabel utama / tabel kiri)
CREATE TABLE order_items (
    item_id INT PRIMARY KEY,                   -- ID item, harus primary key
    order_id INT NOT NULL,                     -- ID pesanan
    product_id INT,                            -- Kunci join, bisa NULL (karena ini LEFT JOIN)
    quantity INT NOT NULL,                     -- Jumlah pembelian
    FOREIGN KEY (product_id) REFERENCES products(product_id) -- Kendala kunci asing opsional
) COMMENT 'COLUMNAR=1';                       


-- LEFT JOIN
CREATE MATERIALIZED VIEW mv_order_with_product
  REFRESH FAST ON DEMAND
  AS SELECT
       oi.item_id,
       oi.order_id,
       p.product_name,
       oi.quantity
     FROM order_items oi
     LEFT JOIN products p ON oi.product_id = p.product_id;

Contoh 5: Tampilan materialisasi bersarang (penggunaan ulang komputasi)

Tampilan materialisasi bersarang dibangun di atas tampilan materialisasi bertahap lainnya, memungkinkan Anda menggunakan kembali hasil komputasi. Misalnya, Anda dapat terlebih dahulu memfilter data valid dari tabel dasar, lalu melakukan agregasi pada hasil yang telah difilter. Selama pembaruan, setiap lapisan hanya memproses perubahan bertahap masing-masing.

  1. Buat tabel dasar.

    CREATE TABLE order_log (
      order_id    INT PRIMARY KEY,
      user_id     INT,
      product_category VARCHAR(50),
      amount      DECIMAL(10,2),
      status      VARCHAR(20),
      created_year INT
    ) COMMENT 'COLUMNAR=1';
    
    INSERT INTO order_log VALUES
      (1, 101, 'electronics', 299.00, 'paid', 2025),
      (2, 102, 'clothing',     59.90, 'paid', 2025),
      (3, 103, 'electronics', 499.00, 'cancelled', 2025),
      (4, 101, 'clothing',    120.00, 'paid', 2025),
      (5, 104, 'electronics',  89.00, 'paid', 2025);
  2. Buat tampilan materialisasi bertahap tingkat pertama untuk memfilter pesanan yang telah dibayar.

    CREATE MATERIALIZED VIEW mv_paid_orders REFRESH FAST ON DEMAND AS
      SELECT order_id, user_id, product_category, amount, created_year
      FROM order_log
      WHERE status = 'paid';

    Lakukan pembaruan penuh untuk mengisi data awal.

    REFRESH MATERIALIZED VIEW mv_paid_orders;
  3. Buat tampilan materialisasi bertahap tingkat kedua untuk mengagregasi statistik berdasarkan kategori, berdasarkan tampilan tingkat pertama.

    CREATE MATERIALIZED VIEW mv_category_revenue REFRESH FAST ON DEMAND AS
      SELECT product_category,
             COUNT(*)    AS order_count,
             SUM(amount) AS total_revenue
      FROM mv_paid_orders
      GROUP BY product_category;

    Lakukan pembaruan penuh untuk mengisi data awal.

    REFRESH MATERIALIZED VIEW mv_category_revenue;
  4. Setelah data tabel dasar berubah, lakukan pembaruan bertahap untuk setiap tingkat secara berurutan.

    -- Tambahkan data baru ke tabel dasar
    INSERT INTO order_log VALUES
      (6, 105, 'electronics', 199.00, 'paid', 2025),
      (7, 106, 'clothing',     75.00, 'cancelled', 2025);
    
    -- Refresh sesuai urutan dependensi: tingkat pertama, lalu tingkat kedua
    REFRESH MATERIALIZED VIEW mv_paid_orders;
    REFRESH MATERIALIZED VIEW mv_category_revenue;
    
    -- Verifikasi hasil: order_id=7 difilter oleh tingkat pertama karena statusnya 'cancelled'
    -- dan tidak akan dimasukkan dalam statistik tingkat kedua.
    SELECT * FROM mv_category_revenue;
Catatan

Untuk memastikan konsistensi data, Anda harus melakukan refresh tampilan materialisasi bersarang sesuai urutan dependensinya, dari tampilan dasar ke tampilan tingkat atas. Tampilan materialisasi yang mendasari harus bertipe pembaruan bertahap (REFRESH FAST).

Lakukan pembaruan bertahap

Untuk memicu pembaruan secara manual, jalankan perintah berikut:

REFRESH MATERIALIZED VIEW mv_name;

Pembaruan bertahap hanya memproses perubahan yang terjadi pada tabel dasar sejak pembaruan terakhir, sehingga cepat dan ber-overhead rendah tanpa memerlukan pemindaian tabel penuh.

Catatan

Ketika Anda menjalankan REFRESH MATERIALIZED VIEW untuk pertama kalinya, sistem secara otomatis melakukan pembaruan penuh untuk mengisi data awal. Pembaruan berikutnya bersifat bertahap.

Hapus tampilan materialisasi

DROP MATERIALIZED VIEW mv_name;

Setelah Anda menghapus tampilan materialisasi, sistem secara otomatis membersihkan tabel delta yang sesuai jika parameter delta_mv_auto_cleanup = ON diaktifkan (default).

Manajemen dan pemantauan

Daftar tampilan materialisasi

SELECT
  table_name,
  table_schema,
  base_tables,
  first_refresh_time,
  refresh_strategy,
  last_start_time,
  last_end_time
FROM mysql.view_materialized_info
WHERE refresh_strategy = 'FAST';

Semua tampilan materialisasi

SELECT * FROM mysql.view_materialized_info;

Segarkan Antrian Tugas

SELECT * FROM information_schema.materialized_view_refresh_queue;

FAQ

Bagaimana cara memverifikasi pembaruan bertahap?

Gunakan pernyataan berikut untuk memverifikasi bahwa refresh_strategy bernilai FAST. Anda juga dapat memeriksa kolom last_refresh_status untuk melihat hasil refresh terbaru.

SELECT table_name, refresh_strategy, last_start_time, last_end_time
FROM mysql.view_materialized_info;

Kapan tampilan materialisasi diperbarui?

Sebelum dilakukan refresh, data tampilan mencerminkan kondisinya pada saat refresh terakhir. Untuk memperbarui data, Anda harus menjalankan secara manual REFRESH MATERIALIZED VIEW mv_name.

Apakah tabel dasar dikunci selama refresh?

Tidak. Anda dapat terus melakukan operasi baca dan tulis normal pada tabel dasar selama pembaruan bertahap tanpa dampak apa pun.

Apakah agregasi didukung untuk pembaruan bertahap?

Pembaruan bertahap saat ini didukung untuk agregasi satu tabel. Agregasi multi-tabel dan UNION ALL saat ini tidak didukung.

Berapa interval refresh minimum?

Interval refresh minimum saat ini adalah 1 detik.