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:
| Keuntungan: Kueri tampilan materialisasi mendukung semua pernyataan SQL. |
Batasan: Data lengkap hanya dapat diperbarui secara batch. | ||
Refresh Cepat | Skema analisis real-time:
| Keuntungan:
|
Batasan:
|
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 VIEWuntuk 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;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;danALTER 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()danrand(), 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.

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.

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
Buat Tampilan Materialisasi: menjelaskan cara membuat tampilan materialisasi.
CREATE MATERIALIZED VIEW: menjelaskan sintaksis tampilan materialisasi.
Kelola Tampilan Materialisasi: menjelaskan cara menanyakan definisi dan catatan refresh tampilan materialisasi, memodifikasi tampilan materialisasi, serta menghapus tampilan materialisasi.