Membuat tampilan materialized yang mendukung pengelompokan atau partisi berdasarkan data untuk skenario tampilan materialized.
Informasi latar belakang
Tampilan adalah kueri tersimpan yang dapat diakses sebagai tabel virtual. Setiap kali Anda mengkueri tampilan, pernyataan kueri dikonversi menjadi Pernyataan SQL yang digunakan untuk mendefinisikan tampilan. Tampilan materialized adalah tabel fisik khusus yang menggunakan sumber daya penyimpanan untuk menyimpan data nyata. Untuk informasi lebih lanjut tentang aturan penagihan tampilan materialized, lihat bagian Aturan Penagihan dalam topik ini.
Tampilan materialized cocok untuk kueri berikut:
Kueri yang dalam mode tetap dan sering dieksekusi.
Kueri yang melibatkan operasi yang memakan waktu, seperti JOIN atau AGGREGATE.
Kueri yang hanya melibatkan sebagian kecil data dalam tabel.
Tabel berikut membandingkan kueri tradisional dan kueri berbasis tampilan materialized.
Item Perbandingan | Kueri Tradisional | Kueri Berbasis Tampilan Materialized |
Pernyataan Kueri | Pernyataan SQL digunakan untuk mengkueri data. | Data dikueri berdasarkan tampilan materialized yang Anda buat. Pernyataan yang digunakan untuk membuat tampilan materialized: Pernyataan yang digunakan untuk mengkueri data berdasarkan tampilan materialized yang Anda buat: Jika fitur penulisan ulang kueri diaktifkan untuk tampilan materialized, data langsung diperoleh dari hasil kueri yang terkandung dalam tampilan materialized saat Anda mengeksekusi pernyataan SQL pertama dalam kode berikut: |
Karakteristik Kueri | Kueri melibatkan pembacaan tabel, JOIN, dan operasi filter (klausa WHERE). Jika tabel sumber berisi banyak data, kecepatan kueri lambat. Operasi kueri kompleks dan efisiensi kueri rendah. | Kueri melibatkan pembacaan tabel dan operasi filter. Operasi JOIN tidak dilibatkan. MaxCompute secara otomatis mencocokkan tampilan materialized optimal dan membaca data dari tampilan materialized optimal. Ini sangat meningkatkan efisiensi kueri. |
Aturan Penagihan
Saat menggunakan tampilan materialized, Anda akan dikenakan biaya untuk item berikut:
Penyimpanan
Tampilan materialized menggunakan penyimpanan fisik. Anda akan dikenakan biaya untuk penyimpanan fisik yang digunakan oleh tampilan materialized. Untuk informasi lebih lanjut tentang harga penyimpanan, lihat Harga Penyimpanan (bayar sesuai pemakaian).
Komputasi
Data dikueri saat Anda membuat, memperbarui, dan mengkueri tampilan materialized, serta menulis ulang kueri (jika tampilan materialized valid). Operasi ini mengonsumsi sumber daya komputasi dan menghasilkan biaya komputasi.
Jika proyek MaxCompute Anda menggunakan metode penagihan langganan, tidak ada biaya komputasi tambahan yang dihasilkan.
Jika proyek MaxCompute Anda menggunakan metode penagihan bayar sesuai pemakaian, biaya dihitung berdasarkan kompleksitas SQL dan jumlah data masukan. Untuk informasi lebih lanjut tentang penagihan, lihat bagian "Penagihan untuk pekerjaan SQL standar" dalam Harga Komputasi. Perhatikan poin-poin berikut:
Pernyataan SQL yang digunakan untuk memperbarui tampilan materialized sama dengan pernyataan SQL yang digunakan untuk membuat tampilan materialized. Jika proyek tempat tampilan materialized milik terikat pada grup sumber daya langganan, sumber daya langganan yang dibeli digunakan, dan tidak ada biaya tambahan yang dihasilkan. Jika proyek terikat pada grup sumber daya bayar sesuai pemakaian, biaya bervariasi berdasarkan jumlah data masukan dan kompleksitas pernyataan SQL. Setelah Anda memperbarui tampilan materialized, Anda akan dikenakan biaya penyimpanan berdasarkan ruang penyimpanan yang digunakan.
Jika tampilan materialized valid, data dibaca dari tampilan materialized saat operasi penulisan ulang kueri dilakukan. Jumlah data masukan yang dibaca dari tampilan materialized pernyataan kueri terkait dengan tampilan materialized dan tidak terkait dengan tabel sumber tampilan materialized. Jika tampilan materialized tidak valid, operasi penulisan ulang kueri tidak dapat dilakukan, dan data dikueri dari tabel sumber. Jumlah data masukan untuk pernyataan kueri terkait dengan tabel sumber. Untuk informasi lebih lanjut tentang cara mengkueri status tampilan materialized, lihat Kueri Status Tampilan Materialized dalam topik ini.
Pembengkakan data mungkin terjadi jika tampilan materialized dihasilkan berdasarkan asosiasi beberapa tabel. Oleh karena itu, jumlah data yang dibaca oleh tampilan materialized mungkin tidak selalu lebih kecil dari jumlah data dalam tabel sumber. MaxCompute tidak dapat menjamin bahwa membaca data dari tampilan materialized lebih murah daripada membaca data dari tabel sumber.
Batasan
Fungsi jendela, Fungsi tabel bernilai pengguna (UDTF), dan fungsi non-deterministik, seperti fungsi skalar yang ditentukan pengguna (UDF) dan fungsi agregat yang ditentukan pengguna (UDAF) tidak didukung.
Jika Anda harus menggunakan fungsi non-deterministik, jalankan perintah set odps.sql.materialized.view.support.nondeterministic.function=true; pada tingkat sesi.
Perhatian
Jika pernyataan kueri berdasarkan mana Anda membuat tampilan materialized gagal dieksekusi, Anda tidak dapat membuat tampilan materialized.
Kolom kunci partisi dalam tampilan materialized harus diturunkan dari tabel sumber. Urutan dan jumlah kolom dalam tampilan materialized harus sama dengan urutan dan jumlah kolom dalam tabel sumber. Nama kolom bisa berbeda.
Anda harus menentukan komentar untuk semua kolom, termasuk kolom kunci partisi. Jika Anda hanya menentukan komentar untuk beberapa kolom, kesalahan akan dikembalikan.
Anda dapat menentukan atribut partisi dan pengelompokan untuk tampilan materialized. Dalam hal ini, data di setiap partisi memiliki atribut pengelompokan yang ditentukan.
Jika pernyataan kueri berdasarkan mana Anda membuat tampilan materialized berisi operator yang tidak didukung oleh tampilan materialized, kesalahan akan dikembalikan. Untuk informasi lebih lanjut tentang operator yang didukung oleh tampilan materialized, lihat Lakukan operasi penulisan ulang kueri berdasarkan tampilan materialized.
Secara default, MaxCompute tidak mengizinkan Anda membuat tampilan materialized menggunakan fungsi non-deterministik, seperti UDF atau UDAF. Jika Anda harus menggunakan fungsi non-deterministik berdasarkan persyaratan bisnis Anda, jalankan perintah
set odps.sql.materialized.view.support.nondeterministic.function=true;pada tingkat sesi.Jika tabel sumber tampilan materialized berisi partisi kosong, Anda dapat menyegarkan tampilan materialized untuk menghasilkan partisi kosong dalam tampilan materialized.
Sintaksis
CREATE MATERIALIZED VIEW [IF NOT EXISTS][project_name.]<mv_name>
[LIFECYCLE <days>] -- Siklus hidup tampilan materialized.
[BUILD DEFERRED] -- Menentukan bahwa hanya skema yang dibuat dan data tidak diperbarui saat Anda membuat tampilan materialized.
[(<col_name> [COMMENT <col_comment>],...)] -- Komentar kolom.
[DISABLE REWRITE] -- Menentukan apakah akan menonaktifkan operasi penulisan ulang kueri yang dilakukan berdasarkan tampilan materialized.
[COMMENT 'komentar tabel'] -- Komentar tampilan materialized.
[PARTITIONED BY (<col_name> [, <col_name>, ...]) -- Partisi dalam tampilan materialized. Parameter ini diperlukan saat Anda membuat tampilan materialized yang dipartisi.
[CLUSTERED BY|RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
[SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
INTO <number_of_buckets> BUCKETS] -- Atribut shuffle dan sort tampilan materialized. Parameter ini diperlukan saat Anda membuat tampilan materialized yang dikelompokkan.
[REFRESH EVERY <num> MINUTES/HOURS/DAYS]
[TBLPROPERTIES("compressionstrategy"="normal/high/extreme", -- Kebijakan kompresi untuk penyimpanan data tampilan materialized.
"enable_auto_substitute"="true", -- Menentukan apakah akan mengkueri data dari tabel partisi sumber jika data partisi yang ingin Anda kueri tidak terkandung dalam tampilan materialized.
"enable_auto_refresh"="true", -- Menentukan apakah akan mengaktifkan fitur pembaruan terjadwal.
"refresh_interval_minutes"="120", -- Interval pembaruan.
"only_refresh_max_pt"="true" -- Menentukan apakah akan memperbarui data partisi terbaru di tabel sumber ke tampilan materialized secara otomatis.
)]
AS <select_statement>;Parameter
Parameter | Diperlukan | Deskripsi |
IF NOT EXISTS | Tidak | Jika Anda tidak menentukan IF NOT EXISTS dan tampilan materialized sudah ada, kesalahan akan dikembalikan. |
project_name | Tidak | Nama proyek MaxCompute tempat tampilan materialized berada. Jika Anda tidak mengonfigurasi parameter ini, proyek MaxCompute saat ini digunakan. Untuk melihat nama proyek MaxCompute, lakukan langkah-langkah berikut: Masuk ke Konsol MaxCompute. Di bilah navigasi atas, pilih wilayah. Lihat nama proyek MaxCompute di halaman Workspace > Projects. |
mv_name | Ya | Nama tampilan materialized yang ingin Anda buat. |
days | Tidak | Siklus hidup tampilan materialized yang ingin Anda buat. Unit: hari. Nilai valid: 1 hingga 37231. |
BUILD DEFERRED | Tidak | Jika kata kunci ini ditambahkan, hanya skema yang dibuat dan data tidak diperbarui saat Anda membuat tampilan materialized. |
col_name | Tidak | Nama kolom dalam tampilan materialized yang ingin Anda buat. |
col_comment | Tidak | Komentar pada kolom dalam tampilan materialized yang ingin Anda buat. |
DISABLE REWRITE | Tidak | Menentukan apakah akan menonaktifkan operasi penulisan ulang kueri yang dilakukan berdasarkan tampilan materialized ini. Jika Anda tidak mengonfigurasi parameter ini, operasi penulisan ulang kueri berdasarkan tampilan materialized ini diizinkan. Dalam hal ini, Anda dapat mengeksekusi pernyataan |
PARTITIONED BY | Tidak | Kolom kunci partisi dalam tampilan materialized yang ingin Anda buat. Jika Anda ingin membuat tampilan materialized yang dipartisi, Anda harus mengonfigurasi parameter ini. |
CLUSTERED BY|RANGE CLUSTERED BY | Tidak | Atribut shuffle tampilan materialized yang ingin Anda buat. Jika Anda ingin membuat tampilan materialized yang dikelompokkan, Anda harus menentukan parameter clustered by atau range clustered by. |
SORTED BY | Tidak | Atribut sort tampilan materialized yang ingin Anda buat. Jika Anda ingin membuat tampilan materialized yang dikelompokkan, Anda harus mengonfigurasi parameter ini. |
REFRESH EVERY | Tidak | Konfigurasikan interval pembaruan terjadwal untuk tampilan materialized. Satuan yang tersedia adalah menit, jam, atau hari. |
number_of_buckets | Tidak | Jumlah bucket dalam tampilan materialized yang ingin Anda buat. Jika Anda ingin membuat tampilan materialized yang dikelompokkan, Anda harus menentukan parameter ini. |
TBLPROPERTIES | Tidak |
|
select_statement | Ya | Pernyataan SELECT. Untuk informasi lebih lanjut tentang sintaksis pernyataan SELECT, lihat Sintaksis SELECT. |
Contoh
Membuat tampilan materialized
Buat tabel bernama
mf_tdanmf_t1dan sisipkan data ke dalam tabel.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 materialized.
Contoh 1: Buat tampilan materialized yang berisi kolom kunci partisi bernama ds.
CREATE MATERIALIZED VIEW mf_mv LIFECYCLE 7 ( key comment 'unique id', value comment 'input value', ds comment 'partisi' ) 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 data dari tampilan materialized yang dibuat. SELECT * FROM mf_mv WHERE ds =1; +------------+------------+------------+ | key | value | ds | +------------+------------+------------+ | 1 | 10 | 1 | +------------+------------+------------+Contoh 2: Buat tampilan materialized non-partisi yang dikelompokkan.
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 materialized berpartisi yang dikelompokkan.
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';
Melakukan penulisan ulang kueri berdasarkan tampilan materialized
Anda memiliki tabel akses halaman bernama visit_records, yang mencatat ID halaman, ID pengguna, dan waktu akses setiap pengguna. Pengguna sering menganalisis lalu lintas halaman yang berbeda. Struktur visit_records adalah sebagai berikut:
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| page_id | string | | |
| user_id | string | | |
| visit_time | string | | |
+------------------------------------------------------------------------------------+Untuk memudahkan analisis, buat tampilan materialized untuk tabel visit_records yang mengelompokkan berdasarkan ID halaman dan menghitung jumlah kunjungan per halaman. Kemudian, lakukan operasi kueri berdasarkan tampilan materialized.
Buat tampilan materialized dengan pernyataan berikut:
CREATE MATERIALIZED VIEW count_mv AS SELECT page_id, count(*) FROM visit_records GROUP BY page_id;Eksekusi pernyataan kueri sebagai berikut:
SET odps.sql.materialized.view.enable.auto.rewriting=true; SELECT page_id, count(*) FROM visit_records GROUP BY page_id;Saat kueri ini dijalankan, MaxCompute secara otomatis mencocokkan tampilan materialized count_mv dan mengambil data agregat darinya.
Verifikasi apakah pernyataan kueri cocok dengan tampilan materialized menggunakan perintah berikut:
EXPLAIN SELECT page_id, count(*) FROM visit_records GROUP BY page_id;Hasilnya adalah sebagai berikut:
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 source dalam hasil menunjukkan bahwa kueri membaca dari tabel count_mv proyek doc_test_dev, mengonfirmasi validitas tampilan materialized dan keberhasilan penulisan ulang kueri.
Melakukan operasi penulisan ulang kueri berdasarkan tampilan materialized
Fitur terpenting dari tampilan materialized adalah melakukan operasi penulisan ulang kueri pada pernyataan kueri. Untuk melakukan operasi penulisan ulang kueri pada pernyataan kueri berdasarkan tampilan materialized, Anda harus menambahkan set odps.sql.materialized.view.enable.auto.rewriting=true; sebelum pernyataan kueri. Jika tampilan materialized tidak valid, tampilan materialized tidak dapat digunakan untuk operasi penulisan ulang kueri. Dalam hal ini, data dikueri dari tabel sumber, dan kecepatan kueri tidak dipercepat.
Secara default, proyek MaxCompute hanya dapat menggunakan tampilan materialized miliknya sendiri untuk operasi penulisan ulang kueri. Jika Anda perlu melakukan operasi penulisan ulang kueri pada pernyataan kueri berdasarkan tampilan materialized 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.
Tabel berikut menunjukkan jenis operator yang didukung untuk penulisan ulang kueri tampilan materialized di MaxCompute, bersama dengan hubungan korespondensinya dengan produk lain:
Jenis Operator | Klasifikasi | MaxCompute | BigQuery | Amazon RedShift | Hive |
FILTER | Pencocokan ekspresi penuh | Didukung | Didukung | Didukung | Didukung |
Pencocokan ekspresi sebagian | Didukung | Didukung | Didukung | Didukung | |
AGGREGATE | Single AGGREGATE | Didukung | Didukung | Didukung | Didukung |
Multiple AGGREGATE | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung | |
JOIN | Jenis JOIN | INNER JOIN | Tidak didukung | INNER JOIN | INNER JOIN |
Single JOIN | Didukung | Tidak didukung | Didukung | Didukung | |
Multiple JOIN | Didukung | Tidak didukung | Didukung | Didukung | |
AGGREGATE+JOIN | - | Didukung | Tidak didukung | Didukung | Didukung |
Operasi penulisan ulang kueri berdasarkan tampilan materialized memerlukan agar data dalam pernyataan kueri diperoleh dari tampilan materialized. Data tersebut mencakup kolom keluaran, 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 materialized atau tidak didukung oleh fungsi agregat, Anda tidak dapat melakukan operasi penulisan ulang kueri berdasarkan tampilan materialized.
Menulis ulang pernyataan kueri dengan kondisi filter
Buat tampilan materialized dengan pernyataan berikut:
CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5;Tabel berikut menunjukkan perbandingan antara pernyataan kueri asli dan pernyataan kueri yang ditulis ulang untuk menjalankan kueri berdasarkan tampilan materialized yang dibuat:
Pernyataan Kueri Asli
Pernyataan 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;Penulisan ulang gagal karena tampilan materialized tidak memiliki kolom d.
SELECT d, e FROM src WHERE a=10;Penulisan ulang gagal karena tampilan materialized tidak memiliki kolom d dan e.
SELECT a, b FROM src WHERE a=1;Penulisan ulang gagal karena tampilan materialized tidak memiliki data dimana a=1.
Menulis ulang pernyataan kueri dengan fungsi agregat
Penulisan ulang didukung jika pernyataan SQL tampilan materialized dan pernyataan kueri memiliki kunci agregasi yang sama. Jika kunci agregasi berbeda, hanya SUM, MIN, dan MAX yang didukung.
Buat tampilan materialized dengan pernyataan berikut:
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 perbandingan antara pernyataan kueri asli dan pernyataan kueri yang ditulis ulang untuk menjalankan kueri berdasarkan tampilan materialized yang dibuat:
Pernyataan Kueri Asli
Pernyataan 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;Penulisan ulang gagal karena tampilan telah melakukan agregasi pada kolom a dan b, sehingga tidak dapat mengagregasi b lagi.
SELECT a, count(c) FROM src GROUP BY a;Penulisan ulang gagal karena re-agregasi tidak didukung untuk fungsi COUNT.
Saat fungsi agregat mencakup DISTINCT, penulisan ulang didukung jika pernyataan SQL tampilan materialized dan pernyataan kueri memiliki kunci agregasi yang sama. Jika tidak, penulisan ulang tidak didukung.
Buat tampilan materialized dengan pernyataan berikut:
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 perbandingan antara pernyataan kueri asli dan pernyataan kueri yang ditulis ulang untuk menjalankan kueri berdasarkan tampilan materialized yang dibuat:
Pernyataan Kueri Asli
Pernyataan Kueri yang Direvisi
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;Penulisan ulang gagal karena re-agregasi tidak didukung untuk fungsi COUNT.
SELECT a, count(DISTINCT c) FROM src GROUP BY a;Penulisan ulang gagal karena agregasi tambahan pada a diperlukan.
Menulis ulang pernyataan kueri dengan JOIN
Menulis ulang input JOIN
Buat tampilan materialized dengan pernyataan berikut:
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 perbandingan antara pernyataan kueri asli dan pernyataan kueri yang ditulis ulang untuk menjalankan kueri berdasarkan tampilan materialized yang dibuat:
Pernyataan Kueri Asli
Pernyataan 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 materialized dengan pernyataan berikut:
--Buat tampilan materialized 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 materialized partisi. CREATE MATERIALIZED VIEW mv LIFECYCLE 7 PARTITIONED BY (ds) AS SELECT t1.id, t1.ds ASds FROM t1 JOIN t2 ON t1.id = t2.id;Tabel berikut menunjukkan perbandingan antara pernyataan kueri asli dan pernyataan kueri yang ditulis ulang untuk menjalankan kueri berdasarkan tampilan materialized yang dibuat:
Pernyataan Kueri Asli
Pernyataan 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;Penulisan ulang gagal karena tampilan materialized tidak memiliki kolom j2.a.
JOIN dengan tabel tambahan
Buat tampilan materialized dengan pernyataan berikut:
CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a;Tabel berikut menunjukkan perbandingan antara pernyataan kueri asli dan pernyataan kueri yang ditulis ulang untuk menjalankan kueri berdasarkan tampilan materialized yang dibuat:
Pernyataan Kueri Asli
Pernyataan 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 jenis pernyataan di atas dapat digabungkan. Jika pernyataan kueri memenuhi kondisi untuk penulisan ulang, maka dapat ditulis ulang sesuai dengan itu.
MaxCompute memilih aturan penulisan ulang yang paling efisien untuk dieksekusi. Jika operasi pasca-penulisan ulang tidak menghasilkan rencana eksekusi optimal, aturan penulisan ulang tidak akan dipilih.
Menulis ulang pernyataan kueri dengan LEFT JOIN
Buat tampilan materialized dengan pernyataan berikut:
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 perbandingan antara pernyataan kueri asli dan pernyataan kueri yang ditulis ulang untuk menjalankan kueri berdasarkan tampilan materialized yang dibuat:
Pernyataan Kueri Asli
Pernyataan 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;
Menulis ulang pernyataan kueri dengan UNION ALL
Buat tampilan materialized dengan pernyataan berikut:
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 perbandingan antara pernyataan kueri asli dan pernyataan kueri yang ditulis ulang untuk menjalankan kueri berdasarkan tampilan materialized yang dibuat:
Pernyataan Kueri Asli
Pernyataan 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, total_amount FROM mv;
Melakukan kueri penetrasi pada tampilan materialized
Tampilan materialized partisi tidak mencakup semua data partisi dalam tabel partisi sumber jika hanya data partisi terbaru yang diperbarui ke tampilan materialized partisi. Jika data partisi yang ingin Anda kueri tidak ada dalam tampilan materialized partisi, sistem melakukan kueri penetrasi untuk mengkueri data dari tabel partisi sumber. Gambar berikut menunjukkan cara melakukan kueri penetrasi.

Untuk mengizinkan tampilan materialized mendukung kueri penetrasi, Anda harus mengonfigurasi parameter berikut:
Saat membuat tampilan materialized, tambahkan "enable_auto_substitute"="true" ke tblproperties.
Contoh berikut menunjukkan cara melakukan kueri penetrasi berdasarkan tampilan materialized.
Buat tampilan materialized partisi yang mendukung kueri penetrasi.
-- Buat tabel bernama src. CREATE TABLE src(id bigint,name string) PARTITIONED BY (dt string); -- Sisipkan data ke dalam tabel. INSERT INTO src PARTITION(dt='20210101') VALUES(1,'Alex'); INSERT INTO src PARTITION(dt='20210102') VALUES(2,'Flink'); -- Buat tampilan materialized 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 partisi 20210101 dalam tabel src dari tampilan materialized mv.
SELECT * FROM mv WHERE dt='20210101';Kueri data partisi 20210102 dalam tabel src dari tampilan materialized mv. Tampilan materialized mv tidak mengandung data partisi tersebut. Oleh karena itu, kueri penetrasi dilakukan untuk mengkueri data partisi dari tabel src.
SELECT * FROM mv WHERE dt = '20210102'; -- Pernyataan di atas setara dengan pernyataan berikut karena tampilan materialized mv tidak mengandung data partisi 20210102 dan data partisi perlu dikueri dari tabel src. SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t;Kueri data partisi 20201230 hingga 20210102 dari tampilan materialized mv. Tampilan materialized mv tidak mengandung semua data partisi. Oleh karena itu, kueri penetrasi dilakukan untuk mendapatkan data yang tidak terkandung dalam tampilan materialized mv, dan operasi UNION dilakukan pada data yang diperoleh dan data yang dikueri dari tampilan materialized mv untuk mengembalikan hasil akhir.
SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id='5'; -- Tampilan materialized mv tidak mengandung data partisi 20210102 dan kueri penetrasi dilakukan untuk mengkueri data partisi 20210102 dari tabel sumber. Pernyataan di atas setara dengan pernyataan berikut: SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20211231' OR dt='20210102' UNION ALL SELECT * FROM mv WHERE dt='20210101' ) t WHERE id = '5';
Pernyataan Terkait
ALTER MATERIALIZED VIEW: Memperbarui tampilan materialized, mengubah siklus hidup tampilan materialized, mengaktifkan atau menonaktifkan fitur siklus hidup untuk tampilan materialized, atau menghapus partisi dari tampilan materialized.
DESC TABLE/VIEW: Melihat informasi tentang tampilan materialized dalam proyek MaxCompute.
SELECT MATERIALIZED VIEW: Mengkueri status tampilan materialized.
DROP MATERIALIZED VIEW: Menghapus tampilan materialized yang ada.