全部产品
Search
文档中心

AnalyticDB:Refresh tampilan materialisasi

更新时间:Jul 02, 2025

Tampilan materialisasi dapat mempercepat kueri kompleks atau menyederhanakan operasi ekstraksi, transformasi, dan pemuatan (ETL). Tampilan ini menyimpan hasil kueri yang telah dihitung sebelumnya, dan hasil tersebut diperbarui sesuai kebutuhan bisnis. Anda dapat memilih kebijakan refresh berdasarkan mode penulisan tabel dasar, kompleksitas komputasi SQL dari kueri tampilan materialisasi, serta ketepatan waktu data.

Pilih kebijakan refresh

Tampilan materialisasi mendukung dua kebijakan refresh: refresh lengkap dan refresh cepat.

  • Refresh lengkap mengeksekusi kueri tampilan materialisasi untuk memindai semua partisi tabel dasar yang terlibat dan menggunakan hasil kueri untuk menimpa data asli tampilan materialisasi.

  • Refresh cepat hanya memindai data yang diperbarui di tabel dasar dan memperbarui data tampilan materialisasi, sehingga mengurangi overhead refresh dengan mencegah pemindaian seluruh data tabel dasar.

Tabel berikut menjelaskan skenario, keuntungan, dan batasan kedua kebijakan refresh tersebut.

Kebijakan Refresh

Skema

Fitur

Refresh Lengkap

Skema pemrosesan batch:

  • Data diperbarui secara batch setiap hari dalam mode T+1.

  • Data diperbarui setiap jam.

  • Sejumlah kecil data dihitung dengan kompleksitas rendah. Latensi tingkat menit diperbolehkan.

Keuntungan: Kueri tampilan materialisasi mendukung semua pernyataan SQL.

Batasan: Data lengkap hanya dapat diperbarui secara batch.

Refresh Cepat

Skema analisis real-time:

  • Data diperbarui secara real-time.

  • Laporan atau operasi ETL diperbarui secara real-time.

  • Latensi tingkat detik diperlukan.

Keuntungan:

  • Sejumlah kecil data dihitung dengan overhead rendah.

  • Biaya pengembangan dan pemeliharaan lebih rendah dibandingkan dengan komputasi aliran.

Batasan:

  • Batasan diberlakukan pada versi, tabel dasar, dan kueri tampilan materialisasi.

  • Refresh manual dan refresh otomatis saat tabel dasar ditimpa tidak didukung.

Pilih mekanisme pemicu refresh

Selain kebijakan refresh, Anda harus menentukan mekanisme pemicu refresh saat membuat tampilan materialisasi. Mekanisme pemicu refresh dapat berupa refresh atas permintaan (ditentukan oleh klausa ON DEMAND) atau refresh otomatis saat tabel dasar ditimpa (ditentukan oleh klausa ON OVERWRITE). Refresh atas permintaan mencakup refresh otomatis pada interval terjadwal dan refresh manual. Jika tidak ditentukan, refresh atas permintaan digunakan.

Saat memilih mekanisme pemicu refresh, pertimbangkan ketepatan waktu data dan beban kerja kluster. Berikut adalah fitur dan skenario berbagai mekanisme pemicu refresh:

  • Refresh manual: Tampilan materialisasi tidak diperbarui secara otomatis. Anda harus mengeksekusi pernyataan REFRESH MATERIALIZED VIEW untuk memperbarui tampilan secara manual. Mekanisme ini cocok untuk skenario dengan persyaratan konsistensi data rendah atau data yang jarang berubah.

  • Refresh otomatis pada interval terjadwal: Tampilan materialisasi diperbarui secara otomatis pada interval tertentu. Jika refresh terakhir masih berlangsung saat waktu refresh tiba, refresh dilewati hingga jadwal berikutnya. Mekanisme ini cocok untuk skenario di mana data tabel dasar berubah secara berkala, seperti catatan transaksi baru yang dihasilkan dalam rentang waktu tertentu setiap hari atau minggu.

  • Refresh otomatis saat tabel dasar ditimpa: Tampilan materialisasi diperbarui secara otomatis saat tabel dasar ditimpa melalui pernyataan INSERT OVERWRITE. Mekanisme ini cocok untuk skenario dengan persyaratan ketepatan waktu dan konsistensi data tinggi.

Tabel berikut menjelaskan mekanisme pemicu refresh yang didukung oleh setiap kebijakan refresh.

Kebijakan refresh

Refresh atas permintaan (ditentukan oleh klausa ON DEMAND)

Refresh otomatis saat tabel dasar ditimpa (ditentukan oleh klausa ON OVERWRITE)

Refresh manual

Refresh otomatis pada interval terjadwal (ditentukan oleh klausa NEXT)

Refresh lengkap

✔️

✔️

✔️

Refresh cepat

✔️

Definisikan kebijakan refresh dan mekanisme pemicu refresh untuk tampilan materialisasi

Contoh berikut menunjukkan cara mendefinisikan kebijakan refresh dan mekanisme pemicu refresh saat membuat tampilan materialisasi berdasarkan tabel pelanggan, penjualan, dan produk.

/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Set mesin tabel ke XUANWU.
CREATE TABLE customer (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(255),
    is_vip Boolean
);
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Set mesin tabel ke XUANWU.
CREATE TABLE sales (
    sale_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    price DECIMAL(10, 2),
    quantity INT,
    sale_date TIMESTAMP
);
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Set mesin tabel ke XUANWU.
CREATE TABLE product (
    product_id INT PRIMARY KEY,
    product_name VARCHAR,
    category_id INT,
    unit_price DECIMAL(10, 2),
    stock_quantity INT
);

Buat tampilan materialisasi yang mendukung refresh lengkap

Gunakan klausa REFRESH COMPLETE untuk menetapkan kebijakan refresh ke refresh lengkap saat membuat tampilan materialisasi.

Tampilan materialisasi yang mendukung refresh lengkap dapat menggunakan mekanisme pemicu refresh berikut: refresh manual, refresh otomatis pada interval terjadwal, dan refresh otomatis saat tabel dasar ditimpa.

  • Buat tampilan materialisasi bernama compl_mv1 yang mendukung refresh lengkap tanpa mekanisme pemicu refresh atau klausa NEXT. Dalam hal ini, refresh manual digunakan.

    CREATE MATERIALIZED VIEW compl_mv1
    REFRESH COMPLETE
    AS
    SELECT * FROM customer;
  • Buat tampilan materialisasi bernama compl_mv2 yang mendukung refresh lengkap dengan klausa ON DEMAND, START WITH, dan NEXT. Contoh ini memperbarui tampilan materialisasi secara otomatis pada pukul 02:00:00 setiap hari.

    CREATE MATERIALIZED VIEW compl_mv2
    REFRESH COMPLETE ON DEMAND
     START WITH DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00')
     NEXT DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00')
    AS
    SELECT * FROM customer;
  • Buat tampilan materialisasi bernama compl_mv3 yang mendukung refresh lengkap dengan klausa ON OVERWRITE. Dalam hal ini, klausa NEXT tidak diperlukan.

    CREATE MATERIALIZED VIEW compl_mv3
    REFRESH COMPLETE ON OVERWRITE
    AS
    SELECT * FROM customer;

Buat tampilan materialisasi yang mendukung refresh cepat

Gunakan klausa REFRESH FAST untuk menetapkan kebijakan refresh ke refresh cepat. Tampilan materialisasi yang mendukung refresh cepat hanya dapat menggunakan refresh otomatis pada interval terjadwal.

Aktifkan fitur pencatatan biner

Sebelum membuat tampilan materialisasi yang mendukung refresh cepat di kluster AnalyticDB for MySQL, aktifkan fitur pencatatan biner untuk kluster dan tabel dasar.

SET ADB_CONFIG BINLOG_ENABLE=true; --Untuk kluster AnalyticDB for MySQL sebelum V3.2.0.0, Anda harus mengeksekusi pernyataan untuk mengaktifkan fitur pencatatan biner. Untuk kluster AnalyticDB for MySQL V3.2.0.0 atau lebih baru, fitur pencatatan biner diaktifkan secara otomatis.
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
ALTER TABLE product binlog=true;
Penting
  • Operasi INSERT OVERWRITE INTO dan TRUNCATE pada tabel dengan fitur pencatatan biner hanya didukung di kluster AnalyticDB for MySQL V3.2.0.0 atau lebih baru.

  • Setelah membuat tampilan materialisasi yang mendukung refresh cepat, fitur pencatatan biner untuk tabel dasar tidak dapat dinonaktifkan.

  • Setelah menghapus tampilan materialisasi yang mendukung refresh cepat, eksekusi pernyataan SET ADB_CONFIG BINLOG_ENABLE=false; dan ALTER TABLE <table_name> binlog=false; dapat menonaktifkan fitur pencatatan biner untuk kluster AnalyticDB for MySQL dan tabel dasar.

Tampilan materialisasi satu-tabel

  • Buat tampilan materialisasi satu-tabel bernama fast_mv1 yang mendukung refresh cepat setiap 10 detik. Kueri tampilan materialisasi tidak melibatkan fungsi agregat.

    CREATE MATERIALIZED VIEW fast_mv1
    REFRESH FAST NEXT now() + INTERVAL 10 second
    AS
    SELECT sale_id, sale_date, price
    FROM sales
    WHERE price > 10;
  • Buat tampilan materialisasi satu-tabel bernama fast_mv2 yang mendukung refresh cepat setiap 5 detik. Kueri tampilan materialisasi melibatkan fungsi agregat dengan GROUP BY.

    CREATE MATERIALIZED VIEW fast_mv2
    REFRESH FAST NEXT now() + INTERVAL 5 second
    AS
    SELECT
       customer_id, sale_date,                 -- Sistem menggunakan kolom GROUP BY sebagai kunci utama dari tampilan materialisasi.
       COUNT(sale_id) AS cnt_sale_id,          -- Lakukan operasi agregat pada kolom.
       SUM(price * quantity) AS total_revenue, -- Lakukan operasi agregat pada kolom.
       customer_id / 100 AS new_customer_id    -- Anda dapat menggunakan ekspresi untuk mendefinisikan kolom yang tidak terlibat dalam operasi agregat.
    FROM sales
    WHERE ifnull(price, 1) > 0                 -- Anda dapat menggunakan ekspresi untuk mendefinisikan kondisi WHERE.
    GROUP BY customer_id, sale_date;
  • Buat tampilan materialisasi satu-tabel bernama fast_mv3 yang mendukung refresh cepat setiap 1 menit. Kueri tampilan materialisasi melibatkan fungsi agregat tanpa GROUP BY.

    CREATE MATERIALIZED VIEW fast_mv3
    REFRESH FAST NEXT now() + INTERVAL 1 minute
    AS
    SELECT count(*) AS cnt   -- Sistem menghasilkan konstanta sebagai kunci utama untuk memastikan bahwa hanya satu rekaman yang terkandung dalam tampilan materialisasi.
    FROM sales;

Tampilan materialisasi multi-tabel

  • Buat tampilan materialisasi multi-tabel bernama fast_mv4 yang mendukung refresh cepat setiap 5 detik. Kueri tampilan materialisasi tidak melibatkan fungsi agregat.

    CREATE MATERIALIZED VIEW fast_mv4
    REFRESH FAST NEXT now() + INTERVAL 5 second
    AS
    SELECT 
        c.customer_id,
        c.customer_name,
        p.product_id,
        s.sale_id,
        (s.price * s.quantity) AS revenue
    FROM 
        sales s
    JOIN 
        customer c ON s.customer_id = c.customer_id
    JOIN 
        product p ON s.product_id = p.product_id;
  • Buat tampilan materialisasi multi-tabel bernama fast_mv5 yang mendukung refresh cepat setiap 10 detik. Kueri tampilan materialisasi melibatkan fungsi agregat dengan GROUP BY.

    CREATE MATERIALIZED VIEW fast_mv5
    REFRESH FAST NEXT now() + INTERVAL 10 second
    AS
    SELECT 
        s.sale_id,
        c.customer_name,
        p.product_name,
        COUNT(*) AS cnt,           
        SUM(s.price * s.quantity) AS revenue,         
        SUM(p.unit_price) AS sum_p          
    FROM 
        sales s
    JOIN 
        (SELECT customer_id, customer_name FROM customer) c ON c.customer_id = s.customer_id
    JOIN 
        (SELECT * FROM product WHERE stock_quantity > 0) p ON p.product_id = s.product_id
    GROUP BY 
        s.sale_id, c.customer_name, p.product_name;

Batasan

Perhatikan batasan berikut untuk tampilan materialisasi yang mendukung refresh cepat:

  • Tabel terpartisi tidak dapat digunakan sebagai tabel dasar untuk membuat tampilan materialisasi yang mendukung refresh cepat di kluster AnalyticDB for MySQL sebelum V3.2.3.0.

  • Pernyataan INSERT OVERWRITE atau TRUNCATE pada tabel dasar dari tampilan materialisasi yang mendukung refresh cepat tidak didukung di kluster AnalyticDB for MySQL sebelum V3.2.3.1. Jika dilakukan, akan terjadi kesalahan.

  • Tampilan materialisasi yang mendukung refresh cepat hanya dapat diperbarui secara otomatis pada interval terjadwal, bukan secara manual. Interval terjadwal berkisar antara 5 detik hingga 5 menit.

  • Berikut adalah batasan yang diberlakukan pada kueri tampilan materialisasi:

    • Tampilan materialisasi harus memberikan data yang sama seperti hasil kueri pada tabel dasar dan mendukung semua operasi DML. Tidak semua kueri tampilan materialisasi memungkinkan tampilan materialisasi mendukung refresh cepat. Jika tampilan materialisasi yang ingin dibuat tidak mendukung refresh cepat, akan terjadi kesalahan.

    • Ekspresi yang mungkin menghasilkan nilai tak tentu, seperti now() dan rand(), tidak dapat digunakan sebagai kondisi dalam kueri tampilan materialisasi.

    • Kueri tampilan materialisasi hanya mendukung fungsi agregat berikut: COUNT(), SUM(), MAX(), MIN(), AVG(), APPROX_DISTINCT(), dan COUNT(DISTINCT).

    • Jika menggunakan fungsi MAX(), MIN(), APPROX_DISTINCT(), atau COUNT(DISTINCT) dalam kueri tampilan materialisasi, hanya operasi INSERT yang dapat dilakukan pada tabel dasar. Operasi yang mengakibatkan penghapusan data, seperti DELETE, UPDATE, REPLACE, dan INSERT ON DUPLICATE KEY UPDATE, tidak didukung.

    • Fungsi agregat kecuali COUNT(DISTINCT) tidak mendukung kata kunci DISTINCT dalam kueri tampilan materialisasi.

    • Fungsi COUNT(DISTINCT) hanya mendukung tipe INTEGER dalam kueri tampilan materialisasi.

    • Fungsi AVG() tidak mendukung tipe DECIMAL dalam kueri tampilan materialisasi.

    • Fungsi agregat tidak mendukung kata kunci HAVING dalam kueri tampilan materialisasi.

    • Kueri tampilan materialisasi tidak mendukung fungsi jendela.

    • Kueri tampilan materialisasi tidak mendukung operasi pengurutan.

    • Kueri tampilan materialisasi tidak mendukung operasi himpunan, seperti UNION, EXCEPT, dan INTERSECT.

  • Berikut adalah batasan yang diberlakukan pada tampilan materialisasi multi-tabel yang mendukung refresh cepat:

    • Tampilan materialisasi multi-tabel hanya mendukung operasi INNER JOIN.

    • Secara default, hingga lima tabel dasar dapat digabungkan untuk membuat tampilan materialisasi.

    • Bidang yang digunakan untuk menggabungkan tabel dasar harus merupakan bidang asli dari tabel dan berfungsi sebagai indeks. Bidang tersebut harus memiliki tipe data yang sama.

Refresh manual tampilan materialisasi

Jika kebijakan refresh diatur ke ON DEMAND dan klausa NEXT tidak ditentukan saat membuat tampilan materialisasi, tampilan materialisasi tidak diperbarui secara otomatis. Anda dapat memperbaruinya secara manual.

REFRESH MATERIALIZED VIEW <mv_name>;

Setelah memulai permintaan refresh, sistem menempatkan pekerjaan refresh di antrian latar belakang. Anda dapat melanjutkan operasi lain sebelum pekerjaan refresh selesai.

Saat pekerjaan refresh selesai, pesan Query OK atau Success dikembalikan.

Kueri catatan refresh tampilan materialisasi

Kueri catatan refresh otomatis

Eksekusi pernyataan berikut untuk menanyakan catatan refresh otomatis tampilan materialisasi, termasuk waktu mulai, waktu akhir, status, dan ID kueri. Untuk informasi lebih lanjut tentang bidang dalam hasil kueri, lihat Kelola Tampilan Materialisasi.

SELECT * FROM information_schema.mv_auto_refresh_jobs where mv_name = '<mv_name>';

Kueri catatan refresh manual

  • Untuk menanyakan catatan refresh manual tampilan materialisasi dalam 30 hari terakhir, gunakan fitur audit SQL. Setelah memasukkan REFRESH MATERIALIZED VIEW mv_name di bidang Kata Kunci pada tab Audit SQL XIHE, Anda dapat melihat informasi seperti waktu, durasi, alamat IP, dan akun database.

    Fitur audit SQL harus diaktifkan secara terpisah. Operasi SQL sebelum fitur ini diaktifkan tidak termasuk dalam log audit.

    image

  • Untuk menanyakan catatan refresh manual dan otomatis tampilan materialisasi dalam 14 hari terakhir, gunakan fitur diagnostik dan optimasi SQL. Setelah memasukkan nama tampilan materialisasi, seperti compl_mv1, pada tab Diagnostik dan Optimasi SQL, Anda dapat melihat informasi tentang semua kueri SQL tampilan materialisasi, seperti waktu mulai, akun database, durasi, dan ID kueri.

    image

Hentikan pekerjaan refresh yang sedang berlangsung

Jika pekerjaan refresh tampilan materialisasi berjalan lama, hubungi dukungan teknis untuk menghentikan pekerjaan tersebut.

Catatan penggunaan

Jika Anda mengeksekusi pernyataan KILL PROCESS <process_id>; untuk menghentikan pekerjaan refresh, refresh berikutnya tetap dipicu saat waktu refresh berikutnya tiba atau saat tabel dasar ditimpa.

Referensi