Topik ini menjelaskan pernyataan CREATE MATERIALIZED VIEW, yang digunakan untuk membuat Tampilan yang di-materialisasi dengan kebijakan refresh lengkap atau cepat serta menentukan jadwal penyegarannya.
Sintaks
CREATE [OR REPLACE] MATERIALIZED VIEW mv_name
[mv_definition]
[mv_properties]
[COMMENT 'view_comment']
[REFRESH {COMPLETE|FAST}]
[ON {DEMAND|OVERWRITE}]
[START WITH date] [NEXT date]
[{DISABLE|ENABLE} QUERY REWRITE]
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 | |
Parameter ini hanya didukung oleh kluster dengan versi kernel 3.1.4.7 atau lebih baru.
| |||
mv_definition | Opsional | Dapat diubah setelah pembuatan: Tidak | |
Menentukan skema Tampilan yang di-materialisasi. Jika klausa ini dihilangkan, sistem menyimpulkan skema dari query_body. Secara default, sistem menentukan kunci primer, membuat indeks pada semua kolom, mengatur kebijakan penyimpanan ke hot storage, dan menggunakan engine XUANWU. Untuk menentukan skema Tampilan yang di-materialisasi secara manual—termasuk kunci distribusi, kunci partisi, kunci primer, indeks, dan kebijakan penyimpanan data hot/cold—gunakan sintaks yang sama seperti pernyataan CREATE TABLE. Misalnya, jika Anda tidak ingin mengindeks semua kolom, Anda dapat menggunakan kata kunci INDEX untuk menentukan kolom mana yang akan diindeks. Untuk mengurangi biaya penyimpanan, Anda juga dapat menentukan kebijakan penyimpanan campuran hot/cold atau bahkan hanya menyimpan data dari tahun terakhir. Aturan kunci primer
RekomendasiUntuk kinerja kueri optimal, kami merekomendasikan menentukan kunci primer, kunci distribusi, dan kunci partisi saat membuat Tampilan yang di-materialisasi. | |||
mv_properties | Opsional | Dapat diubah setelah pembuatan: Ya (dengan menggunakan ALTER MATERIALIZED VIEW) | |
Parameter ini hanya didukung oleh kluster Edisi Perusahaan, Edisi Dasar, dan Edisi Data Lakehouse dengan versi kernel 3.1.9.3 atau lebih baru. Menentukan kebijakan resource untuk Tampilan yang di-materialisasi. Ini mencakup mv_resource_groupMenentukan kelompok sumber daya yang digunakan untuk membuat dan merefresh Tampilan yang di-materialisasi. Jika tidak ditentukan, kelompok sumber daya default Nilai parameter ini dapat berupa kelompok sumber daya Interactive atau Job dari engine XIHE. Perbedaannya adalah kelompok sumber daya Job menyediakan sumber daya sesuai permintaan, yang biasanya menimbulkan latensi dalam hitungan detik atau menit. Jika Anda memiliki toleransi tinggi terhadap latensi refresh, Anda dapat menentukan kelompok sumber daya Job. Tampilan yang di-materialisasi yang menggunakan kelompok sumber daya Job juga dikenal sebagai Tampilan yang di-materialisasi elastis. Untuk meningkatkan kecepatan refresh Tampilan yang di-materialisasi elastis, Anda dapat mengonfigurasi parameter elastic_job_max_acu dalam Anda dapat melihat kelompok sumber daya yang tersedia untuk kluster Anda di halaman Resource Groups di Konsol atau dengan memanggil operasi DescribeDBResourceGroup. Operasi gagal jika kelompok sumber daya yang ditentukan tidak ada. 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 |
Menentukan kebijakan refresh Tampilan yang di-materialisasi. Untuk informasi tentang perbedaan antara kebijakan refresh dan kasus penggunaannya, lihat Pilih kebijakan refresh. COMPLETERefresh lengkap menjalankan kueri SQL asli untuk memindai data semua partisi target di tabel dasar dan sepenuhnya menimpa data lama dengan data hasil perhitungan baru. Refresh lengkap mendukung mekanisme pemicu refresh FASTParameter ini didukung mulai versi 3.1.9.0. Versi 3.1.9.0 hanya mendukung fast refresh untuk Tampilan yang di-materialisasi satu tabel. Versi 3.2.0.0 dan lebih baru mendukung fast refresh untuk Tampilan yang di-materialisasi satu tabel maupun multi-tabel. Menjalankan fast refresh. Sistem menulis ulang kueri tampilan ( Sebelum membuat Tampilan yang di-materialisasi yang menggunakan fast refresh, Anda harus mengaktifkan fitur binary logging untuk kluster dan tabel dasar. Jika tidak, pembuatan akan gagal. Untuk petunjuknya, lihat Aktifkan fitur binary logging. Untuk Tampilan yang di-materialisasi yang menggunakan fast refresh, mekanisme pemicu refresh harus berupa refresh otomatis terjadwal. Anda harus menentukan waktu refresh berikutnya dengan menggunakan Fast refresh memiliki beberapa batasan. Jika | |||
ON [DEMAND | OVERWRITE] | Opsional | Nilai default: DEMAND | Dapat diubah setelah pembuatan: Tidak |
Menentukan mekanisme pemicu refresh Tampilan yang di-materialisasi. Untuk informasi tentang perbedaan antara mekanisme pemicu refresh dan kasus penggunaannya, lihat Pilih mekanisme pemicu refresh. DEMANDRefresh sesuai permintaan. Artinya, Anda dapat merefresh Tampilan yang di-materialisasi secara manual saat diperlukan, atau menggunakan Tampilan yang di-materialisasi fast refresh hanya mendukung OVERWRITETampilan yang di-materialisasi secara otomatis direfresh setelah data di tabel dasarnya ditimpa oleh pernyataan Ketika mekanisme pemicu refresh adalah | |||
[START WITH date] [NEXT date] | Opsional | Dapat diubah setelah pembuatan: Tidak | |
Ketika mekanisme pemicu refresh Tampilan yang di-materialisasi adalah START WITHWaktu refresh pertama. Jika dihilangkan, tampilan direfresh segera setelah pembuatan. NEXTWaktu refresh terjadwal berikutnya.
dateFungsi waktu didukung. Waktu akurat hingga detik, dan milidetik dipotong. | |||
[DISABLE | ENABLE] QUERY REWRITE | Opsional | Nilai default: DISABLE | Dapat diubah setelah pembuatan: Ya (dengan menggunakan ALTER MATERIALIZED VIEW) |
Parameter ini hanya didukung mulai versi 3.1.4. Mengaktifkan atau menonaktifkan penulisan ulang kueri otomatis untuk Tampilan yang di-materialisasi ini. Untuk informasi lebih lanjut, lihat Penulisan ulang kueri untuk Tampilan yang di-materialisasi. DISABLEMenonaktifkan fitur penulisan ulang kueri untuk Tampilan yang di-materialisasi saat ini. ENABLEMengaktifkan fitur penulisan ulang kueri untuk Tampilan yang di-materialisasi saat ini. Setelah Anda mengaktifkan fitur ini, pengoptimal dapat menulis ulang seluruh atau sebagian kueri berdasarkan pola SQL-nya dan mengarahkannya ke Tampilan yang di-materialisasi. Hal ini menghindari eksekusi perhitungan asli pada tabel dasar dan meningkatkan kinerja kueri. | |||
query_body | Wajib | Dapat diubah setelah pembuatan: Tidak | |
Menentukan kueri pada tabel dasar untuk Tampilan yang di-materialisasi. Aturan kolom SELECTKolom dalam daftar SELECT harus mengikuti aturan berikut:
Batasan lainnya | |||
Izin yang diperlukan
Contoh
Prasyarat
Contoh dalam topik ini menggunakan tabel dasar yang dibuat pada bagian ini. Untuk menjalankan contoh, buat terlebih dahulu tabel dasar menggunakan pernyataan SQL berikut.
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Atur 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 */ -- Atur 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
);Tampilan yang di-materialisasi dengan refresh lengkap
Buat Tampilan yang di-materialisasi
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
myview2yang direfresh setiap hari pukul 02.00 pagi.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
myview3yang direfresh setiap hari Senin pukul 02.00 pagi.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
myview4yang direfresh pada pukul 02.00 pagi di hari pertama setiap bulan.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
myview5dan lakukan refresh hanya 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
myview6yang tidak direfresh secara otomatis dan sepenuhnya bergantung pada refresh manual.CREATE MATERIALIZED VIEW myview6 ( PRIMARY KEY (customer_id) ) DISTRIBUTED BY HASH (customer_id) AS SELECT customer_id FROM customer;Lakukan refresh Tampilan yang di-materialisasi secara manual:
REFRESH MATERIALIZED VIEW myview6;Buat Tampilan yang di-materialisasi
myview7. Anda tidak perlu menentukan waktu refresh secara manual karena Tampilan yang di-materialisasi secara otomatis direfresh setelah tabel dasar ditimpa oleh operasiINSERT OVERWRITE.CREATE MATERIALIZED VIEW myview7 REFRESH COMPLETE ON OVERWRITE AS SELECT count(*) as cnt FROM customer;
Tampilan yang di-materialisasi satu tabel dengan fast refresh
Sebelum membuat Tampilan yang di-materialisasi yang menggunakan fast refresh, Anda harus mengaktifkan fitur binary logging untuk kluster dan tabel dasar.
SET ADB_CONFIG BINLOG_ENABLE=true;
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
Tampilan yang di-materialisasi multi-tabel dengan fast refresh
Buat Tampilan yang di-materialisasi multi-tabel bernama
fast_mv4dengan fast refresh dan tanpa agregasi, yang direfresh setiap 5 detik.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_mv5dengan fast refresh dan agregasi bergrup, yang direfresh setiap 10 detik.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 berpartisi
Buat Tampilan yang di-materialisasi myview8 dan tentukan kunci distribusi serta kunci partisi.
CREATE MATERIALIZED VIEW myview8 (
quantity INT, -- Tampilan yang di-materialisasi mencakup semua kolom dari hasil kueri meskipun tidak secara eksplisit tercantum dalam definisi.
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;Menentukan kunci dan indeks
Buat Tampilan yang di-materialisasi
myview9dengan membuat indeks hanya pada kolom yang ditentukancustomer_name, bukan pada semua kolom.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
myview10dengan kunci primer, kunci distribusi, indeks terklaster, indeks pada kolom tertentu, dan komentar.CREATE MATERIALIZED VIEW myview10 ( quantity INT, -- Tampilan yang di-materialisasi mencakup semua kolom dari hasil kueri meskipun tidak secara eksplisit tercantum dalam definisi. 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
myview11menggunakan kelompok sumber daya tipe Jobserverlessuntuk pembuatan dan refresh-nya, dengan frekuensi refresh sekali per 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
myview12yang menggunakan kelompok sumber daya tipe Jobserverlessuntuk pembuatan dan refresh, serta dapat menggunakan 12 ACU sumber daya dari kelompok tersebut.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;
Topik terkait
Tampilan yang di-materialisasi: Pelajari tentang kasus penggunaan dan pembaruan fitur Tampilan yang di-materialisasi.
Buat Tampilan yang di-materialisasi: Pelajari cara membuat Tampilan yang di-materialisasi dan temukan solusi untuk error umum.
Refresh Tampilan yang di-materialisasi: Pelajari cara melakukan refresh lengkap atau cepat pada Tampilan yang di-materialisasi.
Kelola Tampilan yang di-materialisasi: Pelajari cara melihat definisi Tampilan yang di-materialisasi, menampilkan daftar semua Tampilan yang di-materialisasi, dan menghapus Tampilan yang di-materialisasi.