Membuat Tampilan yang di-materialisasi yang mendukung clustering atau partisi berdasarkan data untuk skenario Tampilan yang di-materialisasi.
Latar Belakang
Tampilan adalah tabel virtual yang didefinisikan oleh kueri. Sebaliknya, Tampilan yang di-materialisasi adalah tabel fisik yang menyimpan hasil kueri yang telah dihitung sebelumnya dan mengonsumsi sumber daya penyimpanan. Untuk detail penagihan, lihat Aturan Penagihan.
Tampilan yang di-materialisasi cocok untuk skenario berikut:
Kueri yang sering dieksekusi dengan pola tetap.
Kueri yang melibatkan operasi yang memakan waktu lama, seperti agregasi dan penggabungan tabel (join).
Kueri yang hanya mengakses subset kecil data dalam sebuah tabel.
Tabel berikut membandingkan kueri tradisional dengan kueri Tampilan yang di-materialisasi.
Item | Kueri tradisional | Kueri Tampilan yang di-materialisasi |
Pernyataan kueri | Anda mengkueri data secara langsung menggunakan pernyataan SQL. | Buat Tampilan yang di-materialisasi, lalu kueri tampilan tersebut. Pernyataan berikut membuat Tampilan yang di-materialisasi: Kueri Tampilan yang di-materialisasi: Jika query rewrite diaktifkan untuk Tampilan yang di-materialisasi, sistem secara otomatis menggunakan Tampilan yang di-materialisasi saat Anda menjalankan kueri berikut: |
Karakteristik kueri | Kueri membaca tabel, melakukan join, dan menerapkan filter (klausa WHERE). Untuk tabel sumber yang besar, operasi ini lambat dan intensif resource. | Kueri membaca Tampilan yang di-materialisasi dan menerapkan filter. Tidak diperlukan join. MaxCompute secara otomatis mencocokkan kueri dengan Tampilan yang di-materialisasi optimal dan membaca data langsung darinya, yang secara signifikan meningkatkan performa kueri. |
Aturan Penagihan
Biaya Tampilan yang di-materialisasi terdiri dari dua komponen:
Biaya penyimpanan
Tampilan yang di-materialisasi mengonsumsi penyimpanan fisik, sehingga dikenai biaya penyimpanan berdasarkan model pay-as-you-go. Untuk informasi selengkapnya, lihat Harga Penyimpanan (pay-as-you-go).
Biaya komputasi
Membuat, memperbarui, dan mengkueri Tampilan yang di-materialisasi — termasuk query rewrite saat tampilan valid — mengonsumsi sumber daya komputasi dan dikenai biaya komputasi.
Jika Proyek MaxCompute Anda menggunakan paket langganan, tidak ada biaya tambahan yang dikenai.
Jika Proyek MaxCompute Anda menggunakan paket pay-as-you-go, MaxCompute menghitung biaya berdasarkan kompleksitas SQL dan volume data masukan. Untuk informasi selengkapnya, lihat Harga SQL Standar. Perhatikan hal berikut:
Pernyataan SQL yang digunakan untuk refresh Tampilan yang di-materialisasi sama dengan kueri pendefinisinya. Jika proyek terikat pada kelompok sumber daya komputasi langganan, operasi ini menggunakan sumber daya yang telah Anda beli tanpa biaya tambahan. Jika proyek menggunakan kelompok sumber daya pay-as-you-go, biaya bergantung pada volume data masukan dan kompleksitas SQL. Setelah refresh, biaya penyimpanan dikenai berdasarkan ukuran aktual Tampilan yang di-materialisasi.
Saat Tampilan yang di-materialisasi valid, query rewrite membaca data dari tampilan tersebut. Volume data masukan bergantung pada Tampilan yang di-materialisasi, bukan tabel sumber. Jika tampilan tidak valid, query rewrite tidak tersedia dan kueri membaca langsung dari tabel sumber. Untuk informasi selengkapnya, lihat Kueri status Tampilan yang di-materialisasi.
Saat Tampilan yang di-materialisasi dibuat dari join multi-tabel, dapat terjadi pembengkakan data (data bloat). Membaca dari Tampilan yang di-materialisasi tidak selalu mengurangi biaya dibandingkan membaca langsung dari tabel sumber.
Batasan
Fungsi window, user-defined table-valued function (UDTF), dan fungsi non-deterministik seperti user-defined scalar function (UDF) serta Fungsi agregat yang didefinisikan pengguna (UDAF) tidak didukung.
Jika Anda harus menggunakan fungsi non-deterministik, atur properti tingkat sesi berikut: set odps.sql.materialized.view.support.nondeterministic.function=true;.
Tindakan Pencegahan
Jika pernyataan kueri yang menjadi dasar pembuatan Tampilan yang di-materialisasi gagal dieksekusi, Anda tidak dapat membuat Tampilan yang di-materialisasi tersebut.
Kolom kunci partisi dalam Tampilan yang di-materialisasi harus berasal dari tabel sumber. Urutan dan jumlah kolom dalam Tampilan yang di-materialisasi harus sama dengan urutan dan jumlah kolom dalam tabel sumber. Nama kolom boleh berbeda.
Anda harus menentukan komentar untuk semua kolom, termasuk kolom kunci partisi. Jika Anda hanya menentukan komentar untuk sebagian kolom, sistem akan mengembalikan error.
Anda dapat menentukan atribut partisi dan clustering untuk Tampilan yang di-materialisasi. Dalam kasus ini, data dalam setiap partisi memiliki atribut clustering yang ditentukan.
Jika pernyataan kueri yang menjadi dasar pembuatan Tampilan yang di-materialisasi mengandung operator yang tidak didukung oleh Tampilan yang di-materialisasi, sistem akan mengembalikan error. Untuk informasi selengkapnya tentang operator yang didukung oleh Tampilan yang di-materialisasi, lihat Lakukan operasi query rewrite berdasarkan Tampilan yang di-materialisasi.
Secara default, MaxCompute tidak mengizinkan Anda membuat Tampilan yang di-materialisasi menggunakan fungsi non-deterministik, seperti UDF atau UDAF. Jika Anda harus menggunakan fungsi non-deterministik berdasarkan kebutuhan bisnis, jalankan perintah
set odps.sql.materialized.view.support.nondeterministic.function=true;pada tingkat sesi.Jika tabel sumber Tampilan yang di-materialisasi berisi partisi kosong, Anda dapat merefresh Tampilan yang di-materialisasi untuk menghasilkan partisi kosong dalam Tampilan yang di-materialisasi tersebut.
Sintaks
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]<mv_name>
[LIFECYCLE <days>] --Menentukan siklus hidup.
[BUILD DEFERRED] --Membuat skema tanpa mengisi data.
[(<col_name> [COMMENT <col_comment>], ...)] --Komentar kolom.
[DISABLE REWRITE] --Menentukan apakah Tampilan yang di-materialisasi dapat digunakan untuk query rewrite.
[COMMENT 'table comment'] --Komentar tabel.
[PARTITIONED BY (<col_name> [, <col_name>, ...])] --Membuat Tampilan yang di-materialisasi sebagai tabel partisi.
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
[SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
INTO <number_of_buckets> BUCKETS] --Menetapkan properti shuffle dan sort untuk tabel terkluster.
[REFRESH EVERY <num> {MINUTES | HOURS | DAYS}]
[TBLPROPERTIES("compressionstrategy"="{normal|high|extreme}", --Menentukan strategi kompresi penyimpanan data untuk tabel.
"enable_auto_substitute"="true", --Menentukan apakah akan mengaktifkan query passthrough ke tabel sumber saat partisi tidak ada.
"enable_auto_refresh"="true", --Menentukan apakah akan mengaktifkan refresh otomatis.
"refresh_interval_minutes"="120", --Menentukan interval refresh.
"only_refresh_max_pt"="true" --Untuk Tampilan yang di-materialisasi partisi, hanya merefresh partisi terbaru dari tabel sumber.
)]
AS <select_statement>;Parameter
Parameter | Wajib | Deskripsi |
IF NOT EXISTS | Tidak | Jika Anda tidak menentukan IF NOT EXISTS dan Tampilan yang di-materialisasi sudah ada, operasi akan gagal dengan error. |
project_name | Tidak | Nama Proyek MaxCompute untuk Tampilan yang di-materialisasi. Jika Anda menghilangkan parameter ini, proyek saat ini yang digunakan.
|
mv_name | Ya | Nama Tampilan yang di-materialisasi. |
days | Tidak | Siklus hidup Tampilan yang di-materialisasi dalam hari. Nilainya harus bilangan bulat antara 1 hingga 37231. |
BUILD DEFERRED | Tidak | Jika ditentukan, membuat skema Tampilan yang di-materialisasi tanpa mengisinya dengan data. |
col_name | Tidak | Nama kolom dalam Tampilan yang di-materialisasi. |
col_comment | Tidak | Komentar untuk kolom. |
DISABLE REWRITE | Tidak | Menonaktifkan query rewrite untuk Tampilan yang di-materialisasi. Secara default, query rewrite diaktifkan. Anda dapat menjalankan |
PARTITIONED BY | Tidak | Kolom kunci partisi. Gunakan parameter ini untuk membuat Tampilan yang di-materialisasi partisi. |
CLUSTERED BY|RANGE CLUSTERED BY | Tidak | Properti shuffle untuk membuat tabel terkluster. |
SORTED BY | Tidak | Properti sort untuk membuat tabel terkluster. |
REFRESH EVERY | Tidak | Interval refresh terjadwal untuk Tampilan yang di-materialisasi. Satuan yang valid adalah MINUTES, HOURS, atau DAYS. |
number_of_buckets | Tidak | Jumlah bucket saat membuat tabel terkluster. |
TBLPROPERTIES | Tidak |
|
select_statement | Ya | Pernyataan SELECT yang mendefinisikan Tampilan yang di-materialisasi. Untuk informasi selengkapnya, lihat Sintaks SELECT. |
Contoh
Buat Tampilan yang di-materialisasi
Buat tabel bernama
mf_tdanmf_t1dan masukkan data ke dalam tabel tersebut.CREATE TABLE IF NOT EXISTS mf_t( id bigint, value bigint, name string) PARTITIONED BY (ds STRING); ALTER TABLE mf_t ADD PARTITION (ds='1'); INSERT INTO mf_t PARTITION (ds='1') VALUES (1,10,'kyle'),(2,20,'xia'); SELECT * FROM mf_t WHERE ds ='1'; -- Hasil berikut dikembalikan. +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | kyle | 1 | | 2 | 20 | xia | 1 | +------------+------------+------------+------------+ CREATE TABLE IF NOT EXISTS mf_t1( id bigint, value bigint, name string) PARTITIONED BY (ds STRING); ALTER TABLE mf_t1 ADD PARTITION (ds='1'); INSERT INTO mf_t1 PARTITION (ds='1') VALUES (1,10,'kyle'),(3,20,'john'); SELECT * FROM mf_t1 WHERE ds ='1'; -- Hasil berikut dikembalikan. +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | kyle | 1 | | 3 | 20 | john | 1 | +------------+------------+------------+------------+Buat Tampilan yang di-materialisasi.
Contoh 1: Buat Tampilan yang di-materialisasi yang berisi kolom kunci partisi bernama ds.
CREATE MATERIALIZED VIEW mf_mv LIFECYCLE 7 ( key comment 'unique id', value comment 'input value', ds comment 'partition' ) PARTITIONED BY (ds) AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1'; --Kueri Tampilan yang di-materialisasi. SELECT * FROM mf_mv WHERE ds =1; +------------+------------+------------+ | key | value | ds | +------------+------------+------------+ | 1 | 10 | 1 | +------------+------------+------------+Contoh 2: Buat Tampilan yang di-materialisasi non-partisi yang terkluster.
CREATE MATERIALIZED VIEW mf_mv2 LIFECYCLE 7 CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';Contoh 3: Buat Tampilan yang di-materialisasi partisi yang terkluster.
CREATE MATERIALIZED VIEW mf_mv3 LIFECYCLE 7 PARTITIONED BY (ds) CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
Lakukan query rewrite berdasarkan Tampilan yang di-materialisasi
Skenario
Pertimbangkan tabel kunjungan halaman bernama
visit_recordsyang mencatat ID halaman, ID pengguna, dan waktu kunjungan untuk setiap kunjungan. Tugas analisis yang sering dilakukan adalah menghitung jumlah kunjungan untuk halaman yang berbeda.Dalam situasi ini, Anda dapat membuat Tampilan yang di-materialisasi pada
visit_recordsyang dikelompokkan berdasarkan ID halaman dan menghitung jumlah kunjungan untuk setiap halaman. Anda kemudian dapat menjalankan kueri berikutnya terhadap Tampilan yang di-materialisasi ini.Struktur
visit_recordsadalah sebagai berikut:+------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | page_id | string | | | | user_id | string | | | | visit_time | string | | | +------------------------------------------------------------------------------------+Buat Tampilan yang di-materialisasi.
-- Buat Tampilan yang di-materialisasi untuk tabel visit_records yang dikelompokkan berdasarkan ID halaman dan menghitung jumlah kunjungan untuk setiap halaman. CREATE MATERIALIZED VIEW count_mv AS SELECT page_id, count(*) FROM visit_records GROUP BY page_id;Jalankan kueri berikut:
SET odps.sql.materialized.view.enable.auto.rewriting=true; SELECT page_id, count(*) FROM visit_records GROUP BY page_id;Saat pernyataan kueri ini dieksekusi, MaxCompute secara otomatis mencocokkan Tampilan yang di-materialisasi
count_mvdan membaca data yang telah diagregasi sebelumnya daricount_mv.Untuk memverifikasi bahwa kueri ditulis ulang menggunakan Tampilan yang di-materialisasi, jalankan perintah
EXPLAINberikut:EXPLAIN SELECT page_id, count(*) FROM visit_records GROUP BY page_id;Hasil berikut dikembalikan:
job0 is root job In Job job0: root Tasks: M1 In Task M1: Data source: doc_test_dev.count_mv TS: doc_test_dev.count_mv FS: output: Screen schema: page_id (string) _c1 (bigint) OKData sourcedalam hasil yang dikembalikan menunjukkan bahwa tabel yang dibaca oleh kueri adalahdoc_test_devproject'scount_mv. Hal ini menunjukkan bahwa Tampilan yang di-materialisasi efektif dan query rewrite berhasil.
Lakukan operasi query rewrite berdasarkan Tampilan yang di-materialisasi
Fitur paling penting dari Tampilan yang di-materialisasi adalah melakukan operasi query rewrite pada pernyataan kueri. Untuk melakukan operasi query rewrite pada pernyataan kueri berdasarkan Tampilan yang di-materialisasi, Anda harus menambahkan set odps.sql.materialized.view.enable.auto.rewriting=true; sebelum pernyataan kueri. Jika Tampilan yang di-materialisasi tidak valid, Tampilan yang di-materialisasi tidak dapat digunakan untuk operasi query rewrite. Dalam kasus ini, data dikueri dari tabel sumber, dan kecepatan kueri tidak dipercepat.
Secara default, proyek MaxCompute hanya dapat menggunakan Tampilan yang di-materialisasi miliknya sendiri untuk operasi query rewrite. Jika Anda perlu melakukan operasi query rewrite pada pernyataan kueri berdasarkan Tampilan yang di-materialisasi dari proyek MaxCompute lain, Anda harus menambahkan set odps.sql.materialized.view.source.project.white.list=<project_name1>,<project_name2>,<project_name3>; sebelum pernyataan kueri untuk menentukan proyek MaxCompute tersebut.
Tabel berikut membandingkan jenis operator query rewrite yang didukung oleh MaxCompute dengan produk lain.
Jenis operator | Klasifikasi | MaxCompute | BigQuery | Amazon Redshift | Hive |
FILTER | Pencocokan ekspresi lengkap | Didukung | Didukung | Didukung | Didukung |
Pencocokan ekspresi sebagian | Didukung | Didukung | Didukung | Didukung | |
AGGREGATE | AGGREGATE tunggal | Didukung | Didukung | Didukung | Didukung |
Beberapa AGGREGATE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung | |
JOIN | Jenis JOIN | INNER JOIN | Tidak didukung | INNER JOIN | INNER JOIN |
JOIN tunggal | Didukung | Tidak didukung | Didukung | Didukung | |
Beberapa JOIN | Didukung | Tidak didukung | Didukung | Didukung | |
AGGREGATE+JOIN | - | Didukung | Tidak didukung | Didukung | Didukung |
Operasi query rewrite berdasarkan Tampilan yang di-materialisasi mengharuskan data dalam pernyataan kueri diperoleh dari Tampilan yang di-materialisasi. Data tersebut mencakup kolom output, kolom yang diperlukan oleh operasi filter, kolom yang diperlukan oleh fungsi agregat, dan kolom yang diperlukan oleh operasi JOIN. Jika kolom yang diperlukan dalam pernyataan kueri tidak termasuk dalam Tampilan yang di-materialisasi atau tidak didukung oleh fungsi agregat, Anda tidak dapat melakukan operasi query rewrite berdasarkan Tampilan yang di-materialisasi tersebut.
Contoh 1: Rewrite dengan kondisi filter
Buat Tampilan yang di-materialisasi.
CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5;Tabel berikut memberikan contoh rewrite untuk Tampilan yang di-materialisasi tersebut.
Kueri asli
Kueri yang ditulis ulang
SELECT a,b FROM src WHERE a>5;SELECT a,b FROM mv;SELECT a, b FROM src WHERE a=10;SELECT a,b FROM mv WHERE a=10;SELECT a, b FROM src WHERE a=10 AND b='3';SELECT a,b FROM mv WHERE a=10 AND b=3;SELECT a, b FROM src WHERE a>3;(SELECT a,b FROM src WHERE a>3 AND a<=5) UNION (SELECT a,b FROM mv);SELECT a, b FROM src WHERE a=10 AND d=4;Rewrite gagal karena Tampilan yang di-materialisasi tidak berisi kolom
d.SELECT d, e FROM src WHERE a=10;Rewrite gagal karena Tampilan yang di-materialisasi tidak berisi kolom
ddane.SELECT a, b FROM src WHERE a=1;Rewrite gagal karena Tampilan yang di-materialisasi tidak berisi data di mana
a=1.
Contoh 2: Rewrite dengan fungsi agregat
Semua fungsi agregat dapat ditulis ulang jika Tampilan yang di-materialisasi dan kueri memiliki kunci agregasi yang sama. Jika kunci agregasi berbeda, hanya rewrite menggunakan SUM, MIN, dan MAX yang didukung.
Buat Tampilan yang di-materialisasi.
CREATE MATERIALIZED VIEW mv AS SELECT a, b, sum(c) AS sum, count(d) AS cnt FROM src GROUP BY a, b;Tabel berikut menunjukkan bagaimana kueri ditulis ulang berdasarkan Tampilan yang di-materialisasi.
Kueri asli
Kueri yang ditulis ulang
SELECT a, sum(c) FROM src GROUP BY a;SELECT a, sum(sum) FROM mv GROUP BY a;SELECT a, count(d) FROM src GROUP BY a, b;SELECT a, cnt FROM mv;SELECT a, count(b) FROM (SELECT a, b FROM src GROUP BY a, b) GROUP BY a;SELECT a,count(b) FROM mv GROUP BY a;SELECT a,count(b) FROM mv GROUP BY a;Rewrite gagal karena tampilan telah mengagregasi kolom
adanb, sehingga kolombtidak dapat diagregasi lagi.SELECT a, count(c) FROM src GROUP BY a;Rewrite gagal karena re-agregasi fungsi
COUNTtidak didukung.
Jika fungsi agregat mengandung DISTINCT, kueri dapat ditulis ulang hanya jika Tampilan yang di-materialisasi dan kueri asli memiliki kunci agregasi yang sama. Jika tidak, rewrite tidak dimungkinkan.
Buat Tampilan yang di-materialisasi.
CREATE MATERIALIZED VIEW mv AS SELECT a, b, sum(DISTINCT c) AS sum, count(DISTINCT d) AS cnt FROM src GROUP BY a, b;Tabel berikut menunjukkan bagaimana kueri ditulis ulang berdasarkan Tampilan yang di-materialisasi.
Kueri asli
Kueri yang ditulis ulang
SELECT a, count(DISTINCT d) FROM src GROUP BY a, b;SELECT a, cnt FROM mv;SELECT a, count(c) FROM src GROUP BY a, b;Rewrite gagal karena re-agregasi fungsi
COUNTtidak didukung.SELECT a, count(DISTINCT c) FROM src GROUP BY a;Rewrite gagal karena kolom
amemerlukan agregasi tambahan.
Contoh 3: Rewrite dengan klausa JOIN
Menulis Ulang input JOIN
Buat Tampilan yang di-materialisasi.
CREATE MATERIALIZED VIEW mv1 AS SELECT a, b FROM j1 WHERE b > 10; CREATE MATERIALIZED VIEW mv2 AS SELECT a, b FROM j2 WHERE b > 10;Tabel berikut menunjukkan bagaimana kueri ditulis ulang berdasarkan Tampilan yang di-materialisasi.
Kueri asli
Kueri yang ditulis ulang
SELECT j1.a,j1.b,j2.a FROM (SELECT a,b FROM j1 WHERE b > 10) j1 JOIN j2 ON j1.a=j2.a;SELECT mv1.a, mv1.b, j2.a FROM mv1 JOIN j2 ON mv1.a=j2.a;SELECT j1.a,j1.b,j2.a FROM (SELECT a,b FROM j1 WHERE b > 10) j1 JOIN (SELECT a,b FROM j2 WHERE b > 10) j2 ON j1.a=j2.a;SELECT mv1.a,mv1.b,mv2.a FROM mv1 JOIN mv2 ON mv1.a=mv2.a;
JOIN dengan kondisi filter
Buat Tampilan yang di-materialisasi.
--Buat Tampilan yang di-materialisasi non-partisi. CREATE MATERIALIZED VIEW mv1 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a; CREATE MATERIALIZED VIEW mv2 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 10; --Buat Tampilan yang di-materialisasi partisi. CREATE MATERIALIZED VIEW mv LIFECYCLE 7 PARTITIONED BY (ds) AS SELECT t1.id, t1.ds AS ds FROM t1 JOIN t2 ON t1.id = t2.id;Tabel berikut menunjukkan bagaimana kueri ditulis ulang berdasarkan Tampilan yang di-materialisasi.
Kueri asli
Kueri yang ditulis ulang
SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a=4;SELECT a, b FROM mv1 WHERE a=4;SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 20;SELECT a,b FROM mv2 WHERE a>20;SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5;(SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5 AND j1.a <= 10) UNION SELECT * FROM mv2;SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds='20210306';SELECT key FROM mv WHERE ds='20210306';SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds>='20210306';SELECT key FROM mv WHERE ds>='20210306';SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j2.a=4;Rewrite gagal karena Tampilan yang di-materialisasi tidak berisi kolom
j2.a.
Perluas JOIN
Buat Tampilan yang di-materialisasi.
CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a;Tabel berikut menunjukkan bagaimana kueri ditulis ulang berdasarkan Tampilan yang di-materialisasi.
Kueri asli
Kueri yang ditulis ulang
SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j1.a=j3.a;SELECT mv.a, mv.b FROM mv JOIN j3 ON mv.a=j3.a;SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j2.a=j3.a;SELECT mv.a,mv.b FROM mv JOIN j3 ON mv.a=j3.a;
Ketiga skenario rewrite JOIN ini dapat dikombinasikan.
Karena tujuan query rewrite Tampilan yang di-materialisasi adalah mempercepat kueri, MaxCompute memprioritaskan aturan rewrite yang menawarkan performa terbaik. Aturan tidak diterapkan jika memperkenalkan operasi yang mengakibatkan percepatan buruk.
Contoh 4: Rewrite dengan klausa LEFT JOIN
Buat Tampilan yang di-materialisasi.
CREATE MATERIALIZED VIEW mv LIFECYCLE 7( user_id, job, total_amount ) AS SELECT t1.user_id, t1.job, sum(t2.order_amount) AS total_amount FROM user_info AS t1 LEFT JOIN sale_order AS t2 ON t1.user_id=t2.user_id GROUP BY t1.user_id;Tabel berikut menunjukkan bagaimana kueri ditulis ulang berdasarkan Tampilan yang di-materialisasi.
Kueri asli
Kueri yang ditulis ulang
SELECT t1.user_id, sum(t2.order_amount) AS total_amount FROM user_info AS t1 LEFT JOIN sale_order AS t2 ON t1.user_id=t2.user_id GROUP BY t1.user_id;SELECT user_id, total_amount FROM mv;
Contoh 5: Rewrite dengan klausa UNION ALL
Buat Tampilan yang di-materialisasi.
CREATE MATERIALIZED VIEW mv LIFECYCLE 7( user_id, tran_amount, tran_date ) AS SELECT user_id, tran_amount, tran_date FROM alipay_tran UNION ALL SELECT user_id, tran_amount, tran_date FROM unionpay_tran;Tabel berikut menunjukkan bagaimana kueri ditulis ulang berdasarkan Tampilan yang di-materialisasi.
Kueri asli
Kueri yang ditulis ulang
SELECT user_id, tran_amount FROM alipay_tran UNION ALL SELECT user_id, tran_amount FROM unionpay_tran;SELECT user_id, tran_amount FROM mv;
Penetrasi kueri Tampilan yang di-materialisasi
Tampilan yang di-materialisasi partisi mungkin tidak berisi data untuk semua partisi — misalnya, jika Anda hanya merefresh partisi terbaru. Saat kueri menargetkan partisi yang tidak memiliki data dalam Tampilan yang di-materialisasi, sistem secara otomatis kembali ke tabel partisi sumber. Gambar berikut mengilustrasikan proses ini.

Untuk mengaktifkan fitur kueri penetrasi untuk Tampilan yang di-materialisasi, atur parameter berikut:
Saat membuat Tampilan yang di-materialisasi, tambahkan konfigurasi "enable_auto_substitute"="true" ke tblproperties.
Contoh berikut menunjukkan cara menggunakan Tampilan yang di-materialisasi yang mendukung kueri penetrasi.
Buat Tampilan yang di-materialisasi partisi yang mendukung kueri penetrasi.
-- Buat tabel sumber bernama src. CREATE TABLE src(id bigint,name string) PARTITIONED BY (dt string); -- Masukkan data. INSERT INTO src PARTITION(dt='20210101') VALUES(1,'Alex'); INSERT INTO src PARTITION(dt='20210102') VALUES(2,'Flink'); -- Buat Tampilan yang di-materialisasi partisi yang mendukung kueri penetrasi. CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7 PARTITIONED BY (dt) tblproperties("enable_auto_substitute"="true") AS SELECT id, name, dt FROM src;Kueri data dari partisi
20210101dalam Tampilan yang di-materialisasimv.SELECT * FROM mv WHERE dt='20210101';Kueri data dari partisi
20210102dalam Tampilan yang di-materialisasimv. Sistem secara otomatis melakukan kueri penetrasi pada tabel sumber karena partisi ini belum dimaterialisasi.SELECT * FROM mv WHERE dt = '20210102'; -- Karena data untuk partisi 20210102 belum dimaterialisasi, kueri ditulis ulang untuk mengakses tabel sumber. Ini setara dengan: SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t;Kueri data dari rentang partisi dalam Tampilan yang di-materialisasi
mv. Sistem secara otomatis melakukan kueri penetrasi pada tabel sumber untuk data yang belum dimaterialisasi dan menggabungkannya dengan data yang telah dimaterialisasi menggunakan operasiUNIONsebelum mengembalikan hasil.SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id=5; -- Karena data untuk partisi 20201230 dan 20210102 belum dimaterialisasi, kueri ditulis ulang untuk mengakses tabel sumber. Ini setara dengan: SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20201230' OR dt='20210102' UNION ALL SELECT * FROM mv WHERE dt='20210101' ) t WHERE id = 5;
Pernyataan Terkait
ALTER MATERIALIZED VIEW: memperbarui Tampilan yang di-materialisasi, mengubah siklus hidup Tampilan yang di-materialisasi, mengaktifkan atau menonaktifkan fitur siklus hidup untuk Tampilan yang di-materialisasi, atau menghapus partisi dari Tampilan yang di-materialisasi.
DESC TABLE/VIEW: melihat informasi tentang Tampilan yang di-materialisasi dalam proyek MaxCompute.
SELECT MATERIALIZED VIEW: mengkueri status Tampilan yang di-materialisasi.
DROP MATERIALIZED VIEW: menghapus Tampilan yang di-materialisasi yang ada.