Topik ini menjelaskan pernyataan CREATE MATERIALIZED VIEW, yang dapat digunakan untuk membuat tampilan yang di-materialisasi yang mendukung refresh lengkap atau cepat serta mengonfigurasi jadwal refresh-nya.
Sintaksis
CREATE [OR REPLACE] MATERIALIZED VIEW mv_name
[mv_definition]
[mv_properties]
[REFRESH {COMPLETE|FAST}]
[ON {DEMAND|OVERWRITE}]
[START WITH date] [NEXT date]
[{DISABLE|ENABLE} QUERY REWRITE]
[COMMENT 'view_comment']
AS
query_body
mv_definition:
({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'column_comment']
| table_constraints}
[, ... ])
[table_attribute]
[partition_options]
[index_all]
[storage_policy]
[block_size]
[engine]
[table_properties]Parameter
OR REPLACE | Opsional | Dapat diubah setelah pembuatan: tidak | |
Hanya kluster AnalyticDB for MySQL versi V3.1.4.7 atau lebih baru yang mendukung parameter ini.
| |||
mv_definition | Opsional | Dapat diubah setelah pembuatan: tidak | |
Anda dapat mendefinisikan struktur tampilan yang di-materialisasi. Anda dapat memilih apakah akan secara eksplisit mendefinisikan skema tampilan yang di-materialisasi. Jika Anda tidak secara eksplisit mendefinisikan skema tersebut, AnalyticDB for MySQL akan menggunakan kolom dari hasil query_body sebagai kolom tampilan yang di-materialisasi, mendefinisikan kunci primer, membuat indeks pada semua kolom, mengonfigurasi penyimpanan data panas, dan menetapkan mesin ke XUANWU. Untuk mendefinisikan skema secara manual—termasuk kunci distribusi, kunci partisi, kunci primer, indeks, dan kebijakan penyimpanan bertingkat untuk data panas dan dingin—gunakan metode yang sama seperti pada pernyataan CREATE TABLE. Misalnya, jika Anda tidak perlu mengindeks semua kolom, gunakan kata kunci INDEX untuk menentukan kolom mana yang akan diindeks. Untuk mengurangi biaya penyimpanan, atur kebijakan penyimpanan menjadi penyimpanan campuran data panas-dingin atau simpan hanya data satu tahun terakhir. Aturan kunci primer
RekomendasiUntuk mengoptimalkan kinerja kueri, definisikan kunci primer, kunci distribusi, dan kunci partisi saat membuat tampilan yang di-materialisasi. | |||
mv_properties | Opsional | Dapat diubah setelah pembuatan: ya (menggunakan pernyataan ALTER MATERIALIZED VIEW) | |
Hanya kluster AnalyticDB for MySQL Edisi Perusahaan, Edisi Dasar, atau Edisi Data Lakehouse versi V3.1.9.3 atau lebih baru yang mendukung parameter ini. Kebijakan resource untuk tampilan yang di-materialisasi, termasuk kelompok sumber daya yang digunakan (mv_resource_group) dan petunjuk konfigurasi untuk tugas refresh (mv_refresh_hints). Parameter ini menggunakan format JSON. Contoh: mv_resource_groupKelompok sumber daya yang digunakan untuk membuat dan merefresh tampilan yang di-materialisasi. Jika Anda tidak menentukannya, kelompok sumber daya default user_default akan digunakan. Anda dapat mengaturnya ke kelompok sumber daya interaktif atau kelompok sumber daya pekerjaan yang didukung mesin XIHE. Kelompok sumber daya pekerjaan memerlukan waktu beberapa detik hingga menit untuk menyediakan sumber daya. Jika Anda dapat menerima latensi refresh yang lebih tinggi, gunakan kelompok sumber daya pekerjaan. Tampilan yang di-materialisasi yang menggunakan kelompok sumber daya pekerjaan disebut tampilan yang di-materialisasi elastis. Untuk meningkatkan kecepatan refresh tampilan yang di-materialisasi elastis, konfigurasikan elastic_job_max_acu dalam mv_refresh_hints untuk meningkatkan batas maksimum sumber daya. Lihat contoh tampilan yang di-materialisasi elastis. Anda dapat melihat kelompok sumber daya yang tersedia di halaman Resource Groups di Konsol atau panggil operasi DescribeDBResourceGroup. Jika kelompok sumber daya yang ditentukan tidak ada, kesalahan akan terjadi saat Anda membuat tampilan yang di-materialisasi. mv_refresh_hintsMenentukan parameter konfigurasi untuk tampilan yang di-materialisasi. Untuk daftar parameter yang didukung beserta penggunaannya, lihat Common Hints. | |||
REFRESH [COMPLETE | FAST] | Opsional | Nilai default: COMPLETE | Dapat diubah setelah pembuatan: tidak |
Kebijakan refresh untuk tampilan yang di-materialisasi. Untuk perbedaan antar kebijakan dan skenario penggunaannya, lihat Cara memilih kebijakan refresh. COMPLETERefresh lengkap menjalankan SQL kueri asli setiap kali, memindai semua partisi target dari tabel dasar, dan menimpa data lama dengan data yang baru dihitung. Refresh lengkap mendukung mekanisme pemicu berikut: refresh manual sesuai permintaan, refresh otomatis terjadwal ( FASTHanya kluster AnalyticDB for MySQL versi V3.1.9.0 atau lebih baru yang mendukung parameter ini. Versi V3.1.9.0 hanya mendukung tampilan yang di-materialisasi satu tabel dengan refresh cepat. Versi V3.2.0.0 atau lebih baru mendukung tampilan yang di-materialisasi satu tabel maupun multi-tabel dengan refresh cepat. Refresh cepat menulis ulang kueri tampilan yang di-materialisasi (query_body) untuk hanya memindai data yang berubah di tabel dasar (INSERT, DELETE, UPDATE), memprosesnya, lalu menulisnya ke tampilan yang di-materialisasi. Hal ini menghindari pemindaian seluruh data tabel dasar dan mengurangi beban komputasi per refresh. Sebelum membuat tampilan yang di-materialisasi dengan refresh cepat, aktifkan binary logging untuk kluster dan tabel dasar. Jika tidak, pembuatan akan gagal. Lihat Aktifkan binary logging. Tampilan yang di-materialisasi dengan refresh cepat harus menggunakan refresh otomatis terjadwal. Tentukan waktu refresh berikutnya menggunakan Tampilan yang di-materialisasi dengan refresh cepat memiliki batasan tertentu. Jika query_body tidak mendukung refresh cepat, pembuatan akan gagal. | |||
ON [DEMAND | OVERWRITE] | Opsional | Nilai default: DEMAND | Dapat diubah setelah pembuatan: tidak |
Mekanisme pemicu refresh untuk tampilan yang di-materialisasi. Untuk perbedaan antar mekanisme dan skenario penggunaannya, lihat Cara memilih mekanisme pemicu refresh. DEMANDRefresh sesuai permintaan. Picu refresh secara manual atau gunakan klausa Tampilan yang di-materialisasi dengan refresh cepat hanya mendukung OVERWRITERefresh otomatis saat tabel dasar ditimpa oleh pernyataan Jika Anda mengatur mekanisme pemicu ke | |||
[START WITH date] [NEXT date] | Opsional | Dapat diubah setelah pembuatan: tidak | |
Tentukan waktu refresh hanya ketika mekanisme pemicunya adalah START WITHWaktu refresh pertama. Jika dihilangkan, refresh pertama terjadi saat pembuatan. NEXTWaktu refresh berikutnya.
dateFungsi waktu didukung tetapi harus akurat hingga detik. Milidetik akan dipotong. | |||
[DISABLE | ENABLE] QUERY REWRITE | Opsional | Nilai default: DISABLE | Dapat diubah setelah pembuatan: ya (menggunakan pernyataan ALTER MATERIALIZED VIEW) |
Parameter ini hanya didukung oleh versi 3.1.4 dan lebih baru. Mengaktifkan atau menonaktifkan penulisan ulang kueri untuk tampilan yang di-materialisasi. Untuk detailnya, lihat Penulisan ulang kueri untuk tampilan yang di-materialisasi. DISABLEMenonaktifkan penulisan ulang kueri untuk tampilan yang di-materialisasi. ENABLEMengaktifkan penulisan ulang kueri untuk tampilan yang di-materialisasi. Setelah diaktifkan, pengoptimal akan menulis ulang kueri secara penuh atau sebagian berdasarkan pola SQL dan mengarahkannya ke tampilan yang di-materialisasi. Hal ini menghindari komputasi pada tabel dasar dan meningkatkan kinerja kueri. | |||
query_body | Wajib | Dapat diubah setelah pembuatan: tidak | |
Kueri tabel dasar untuk tampilan yang di-materialisasi. Untuk tampilan yang di-materialisasi dengan refresh penuh, tabel dasarnya dapat berupa tabel internal, tabel eksternal, tampilan yang di-materialisasi yang sudah ada, dan tampilan di AnalyticDB for MySQL. Tidak ada batasan pada kueri tabel dasar. Untuk informasi lebih lanjut tentang sintaksis kueri, lihat SELECT. Untuk tampilan yang di-materialisasi dengan refresh bertahap, tabel dasarnya hanya dapat berupa tabel internal di AnalyticDB for MySQL. Kueri tabel dasar harus mengikuti aturan berikut: SELECT kolom output
Batasan lainnya
| |||
Izin yang diperlukan
Untuk membuat tampilan yang di-materialisasi, pengguna harus memiliki semua izin berikut:
Izin CREATE pada database tempat tampilan yang di-materialisasi akan dibuat.
Izin SELECT pada kolom terkait atau seluruh tabel dasar tampilan yang di-materialisasi.
Jika ingin membuat tampilan yang di-materialisasi dengan refresh otomatis, Anda juga memerlukan izin berikut:
Izin untuk menghubungkan ke AnalyticDB for MySQL dari alamat IP mana pun (
'%').Izin INSERT pada tampilan itu sendiri atau pada semua tabel dalam database-nya, yang diperlukan untuk merefresh data dalam tampilan yang di-materialisasi.
Contoh
Persiapan contoh
Contoh tampilan yang di-materialisasi berikut menggunakan tabel dasar yang didefinisikan dalam bagian ini. Untuk mencoba contohnya, jalankan terlebih dahulu pernyataan SQL berikut untuk membuat tabel dasar.
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Menentukan XUANWU sebagai mesin tabel.
CREATE TABLE customer (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(255),
is_vip Boolean
);/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Menentukan XUANWU sebagai mesin tabel.
CREATE TABLE sales (
sale_id INT PRIMARY KEY,
product_id INT,
customer_id INT,
price DECIMAL(10, 2),
quantity INT,
sale_date TIMESTAMP
);Refresh Penuh Tampilan yang Di-Materialisasi
Buat tampilan yang di-materialisasi bernama
myview1yang direfresh setiap 5 menit.CREATE MATERIALIZED VIEW myview1 REFRESH -- Setara dengan REFRESH COMPLETE. NEXT now() + INTERVAL 5 minute AS SELECT count(*) as cnt FROM customer;Buat tampilan yang di-materialisasi bernama
myview2yang direfresh setiap hari pukul 02:00:00.CREATE MATERIALIZED VIEW myview2 REFRESH COMPLETE 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 count(*) as cnt FROM customer;Buat tampilan yang di-materialisasi bernama
myview3yang direfresh setiap hari Senin pukul 02:00:00.CREATE MATERIALIZED VIEW myview3 REFRESH COMPLETE ON DEMAND START WITH DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM customer;Buat tampilan yang di-materialisasi bernama
myview4yang direfresh pada hari pertama setiap bulan pukul 02:00:00.CREATE MATERIALIZED VIEW myview4 REFRESH -- Setara dengan REFRESH COMPLETE. NEXT DATE_FORMAT(last_day(now()) + INTERVAL 1 day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM customer;Buat tampilan yang di-materialisasi bernama
myview5yang hanya direfresh sekali.CREATE MATERIALIZED VIEW myview5 REFRESH -- Setara dengan REFRESH COMPLETE. START WITH now() + INTERVAL 1 day AS SELECT count(*) as cnt FROM customer;Buat tampilan yang di-materialisasi bernama
myview6yang tidak direfresh secara otomatis. Refresh secara manual.CREATE MATERIALIZED VIEW myview6 ( PRIMARY KEY (customer_id) ) DISTRIBUTED BY HASH (customer_id) AS SELECT customer_id FROM customer;Refresh tampilan yang di-materialisasi secara manual:
REFRESH MATERIALIZED VIEW myview6;Buat tampilan yang di-materialisasi bernama
myview7yang direfresh secara otomatis saat tabel dasar ditimpa. Tidak perlu refresh manual.CREATE MATERIALIZED VIEW myview7 REFRESH COMPLETE ON OVERWRITE AS SELECT count(*) as cnt FROM customer;
Buat tampilan yang di-materialisasi satu tabel yang mendukung refresh cepat
Sebelum membuat tampilan yang di-materialisasi yang mendukung refresh cepat, aktifkan binary logging untuk kluster dan tabel dasar.
SET ADB_CONFIG BINLOG_ENABLE=true;
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
Buat tampilan yang di-materialisasi satu tabel bernama fast_mv1 yang mendukung refresh cepat dengan interval 10 detik. Kueri tampilan yang di-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 yang di-materialisasi satu tabel bernama fast_mv2 yang mendukung refresh cepat dengan interval 5 detik. Kueri tampilan yang di-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 primer tampilan yang di-materialisasi. COUNT(sale_id) AS cnt_sale_id, -- Melakukan operasi agregat pada kolom. SUM(price * quantity) AS total_revenue, -- Melakukan 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 yang di-materialisasi satu tabel bernama fast_mv3 yang mendukung refresh cepat dengan interval 1 menit. Kueri tampilan yang di-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 primer untuk memastikan hanya satu catatan yang ada dalam tampilan yang di-materialisasi. FROM sales;
Buat tampilan yang di-materialisasi multi-tabel yang mendukung refresh cepat
Buat tampilan yang di-materialisasi multi-tabel bernama fast_mv4 yang mendukung refresh cepat dengan interval 5 detik dan tidak menggunakan agregasi.
CREATE MATERIALIZED VIEW fast_mv4 REFRESH FAST NEXT now() + INTERVAL 5 second AS SELECT c.customer_id, c.customer_name, s.sale_id, (s.price * s.quantity) AS revenue FROM sales s JOIN customer c ON s.customer_id = c.customer_id;Buat tampilan yang di-materialisasi multi-tabel bernama fast_mv5 yang mendukung refresh cepat dengan interval 10 detik dan menggunakan agregasi bergrup.
CREATE MATERIALIZED VIEW fast_mv5 REFRESH FAST NEXT now() + INTERVAL 10 second AS SELECT s.sale_id, c.customer_name, COUNT(*) AS cnt, SUM(s.price * s.quantity) AS revenue FROM sales s JOIN (SELECT customer_id, customer_name FROM customer) c ON c.customer_id = s.customer_id GROUP BY s.sale_id, c.customer_name;
Tampilan yang di-materialisasi terpartisi
Buat tampilan yang di-materialisasi bernama myview8 dengan kunci distribusi dan kunci partisi.
CREATE MATERIALIZED VIEW myview8 (
quantity INT, -- Tampilan yang di-materialisasi mencakup semua kolom dari hasil kueri meskipun tidak ada kolom yang ditampilkan secara eksplisit.
price DECIMAL(10, 2),
sale_date TIMESTAMP
)
DISTRIBUTED BY HASH(sale_id)
PARTITION BY VALUE(date_format(sale_date, "%Y%m%d")) LIFECYCLE 30
AS
SELECT * FROM sales;Definisikan secara eksplisit kunci primer, kunci distribusi, indeks, dll.
Buat tampilan yang di-materialisasi bernama
myview9yang hanya mengindeks kolomcustomer_name.CREATE MATERIALIZED VIEW myview9 ( INDEX (sale_date), PRIMARY KEY (sale_id) ) DISTRIBUTED BY HASH (sale_id) REFRESH NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales;Buat tampilan yang di-materialisasi bernama
myview10yang mendefinisikan kunci primer, kunci distribusi, indeks terkluster, indeks berbasis kolom, dan komentar.CREATE MATERIALIZED VIEW myview10 ( quantity INT, -- Tampilan yang di-materialisasi mencakup semua kolom dari hasil kueri meskipun tidak ada kolom yang ditampilkan secara eksplisit. price DECIMAL(10, 2), KEY INDEX_ID(customer_id) COMMENT 'customer', CLUSTERED KEY INDEX(sale_id), PRIMARY KEY(sale_id,sale_date) ) DISTRIBUTED BY HASH(sale_id) COMMENT 'MATERIALIZED VIEW c' AS SELECT * FROM sales;
Tampilan yang Di-Materialisasi Elastis
Buat tampilan yang di-materialisasi elastis bernama
myview11yang menggunakan kelompok sumber daya pekerjaan arsitektur tanpa server dan direfresh setiap hari.CREATE MATERIALIZED VIEW myview11 MV_PROPERTIES='{ "mv_resource_group":"serverless" }' REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales;Buat tampilan yang di-materialisasi elastis bernama
myview12yang menggunakan kelompok sumber daya pekerjaan arsitektur tanpa server dan dapat mengonsumsi hingga 12 ACU.CREATE MATERIALIZED VIEW myview12 MV_PROPERTIES='{ "mv_resource_group":"serverless", "mv_refresh_hints":{"elastic_job_max_acu":"12"} }' REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales;
Referensi
Tampilan yang di-materialisasi: menjelaskan skenario penggunaan dan pembaruan fitur.
Buat tampilan yang di-materialisasi: menjelaskan cara membuat tampilan yang di-materialisasi dan memecahkan masalah umum.
Refresh tampilan yang di-materialisasi: menjelaskan cara mengonfigurasi refresh lengkap atau cepat.
Kelola tampilan yang di-materialisasi: menjelaskan cara menanyakan definisi, menampilkan daftar semua tampilan yang di-materialisasi, dan menghapus tampilan yang di-materialisasi.