MaxCompute mendukung penulisan ulang kueri SQL asli untuk menggunakan tampilan yang di-materialisasi jika kueri tersebut berisi kondisi filter atau jenis operator tertentu.
Usage notes
Prinsip utama penulisan ulang kueri tampilan yang di-materialisasi adalah bahwa tampilan yang di-materialisasi harus mencakup semua data yang dibutuhkan oleh kueri, termasuk kolom output serta kolom yang digunakan dalam kondisi filter, fungsi agregat, atau kondisi JOIN. Kueri tidak dapat ditulis ulang jika memerlukan kolom yang tidak tersedia dalam tampilan yang di-materialisasi atau jika menggunakan fungsi agregat yang tidak didukung.
Untuk mengaktifkan penulisan ulang kueri tampilan yang di-materialisasi, tambahkan konfigurasi berikut sebelum pernyataan kueri Anda:
SET odps.sql.materialized.view.enable.auto.rewriting=true;Penulisan ulang kueri tidak didukung ketika tampilan yang di-materialisasi berada dalam keadaan tidak valid. Dalam kasus tersebut, kueri dijalankan langsung terhadap tabel sumber tanpa akselerasi.
Cross-project rewrite
Secara default, proyek MaxCompute hanya dapat menggunakan tampilan yang di-materialisasi miliknya sendiri untuk penulisan ulang kueri. Untuk menggunakan tampilan yang di-materialisasi dari proyek lain, Anda harus menentukan daftar proyek MaxCompute yang diizinkan dengan menambahkan konfigurasi berikut sebelum kueri Anda:
SET odps.sql.materialized.view.source.project.white.list = <project_name1>,<project_name2>,<project_name3>;Untuk mengaktifkan penulisan ulang yang menggunakan tampilan yang di-materialisasi yang didefinisikan dengan
LEFT/RIGHT JOINatauUNION ALL, tambahkan konfigurasi berikut sebelum pernyataan kueri Anda:SET odps.sql.materialized.view.enable.substitute.rewriting=true;
Supported operator types
Tabel berikut membandingkan jenis operator penulisan ulang kueri yang didukung oleh MaxCompute dengan produk lain.
Operator type | Classification | MaxCompute | BigQuery | Amazon Redshift | Hive |
FILTER | Full expression match | Supported | Supported | Supported | Supported |
Partial expression match | Supported | Supported | Supported | Supported | |
AGGREGATE | Single AGGREGATE | Supported | Supported | Supported | Supported |
Multiple AGGREGATEs | Not supported | Not supported | Not supported | Not supported | |
JOIN | JOIN type | INNER JOIN | Not supported | INNER JOIN | INNER JOIN |
Single JOIN | Supported | Not supported | Supported | Supported | |
Multiple JOINs | Supported | Not supported | Supported | Supported | |
AGGREGATE+JOIN | - | Supported | Not supported | Supported | Supported |
Examples
Example 1: Rewrite with filter conditions
Buat tampilan yang di-materialisasi.
CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5;Tabel berikut menyediakan contoh penulisan ulang untuk tampilan yang di-materialisasi.
Original query
Rewritten query
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 yang di-materialisasi tidak berisi kolom
d.SELECT d, e FROM src WHERE a=10;Penulisan ulang gagal karena tampilan yang di-materialisasi tidak berisi kolom
ddane.SELECT a, b FROM src WHERE a=1;Penulisan ulang gagal karena tampilan yang di-materialisasi tidak berisi data dengan
a=1.
Example 2: Rewrite with aggregate functions
Semua fungsi agregat dapat ditulis ulang jika tampilan yang di-materialisasi dan kueri memiliki kunci agregasi yang sama. Jika kunci agregasinya berbeda, hanya penulisan ulang yang 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 cara kueri ditulis ulang berdasarkan tampilan yang di-materialisasi.
Original query
Rewritten query
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 meng-agregasi kolom
adanb, sehingga kolombtidak dapat di-agregasi lagi.SELECT a, count(c) FROM src GROUP BY a;Penulisan ulang gagal karena re-agregasi fungsi
COUNTtidak didukung.
Jika suatu fungsi agregat berisi DISTINCT, kueri hanya dapat ditulis ulang jika tampilan yang di-materialisasi dan kueri asli memiliki kunci agregasi yang sama. Jika tidak, penulisan ulang 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 cara kueri ditulis ulang berdasarkan tampilan yang di-materialisasi.
Original query
Rewritten query
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 fungsi
COUNTtidak didukung.SELECT a, count(DISTINCT c) FROM src GROUP BY a;Penulisan ulang gagal karena kolom
amemerlukan agregasi tambahan.
Example 3: Rewrite with a JOIN clause
Rewrite JOIN inputs
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 cara kueri ditulis ulang berdasarkan tampilan yang di-materialisasi.
Original query
Rewritten query
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 with filter conditions
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 cara kueri ditulis ulang berdasarkan tampilan yang di-materialisasi.
Original query
Rewritten query
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 yang di-materialisasi tidak berisi kolom
j2.a.
Extend a 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 cara kueri ditulis ulang berdasarkan tampilan yang di-materialisasi.
Original query
Rewritten query
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 penulisan ulang JOIN ini dapat dikombinasikan.
Karena tujuan penulisan ulang kueri tampilan yang di-materialisasi adalah untuk mempercepat kueri, MaxCompute memprioritaskan aturan penulisan ulang yang memberikan performa terbaik. Aturan tidak diterapkan jika menghasilkan operasi yang menyebabkan akselerasi buruk.
Example 4: Rewrite with a LEFT JOIN clause
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 cara kueri ditulis ulang berdasarkan tampilan yang di-materialisasi.
Original query
Rewritten query
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;
Example 5: Rewrite with a UNION ALL clause
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 cara kueri ditulis ulang berdasarkan tampilan yang di-materialisasi.
Original query
Rewritten query
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;
Example 6: Use case
Scenario
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 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 selanjutnya 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;Ketika pernyataan kueri ini dieksekusi, MaxCompute secara otomatis mencocokkan tampilan yang di-materialisasi
count_mvdan membaca data yang telah di-agregasi 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 penulisan ulang kueri berhasil.
Related documents
Untuk informasi lebih lanjut tentang operasi tampilan yang di-materialisasi, lihat Materialized view operations.
Untuk informasi lebih lanjut tentang fitur pembaruan terjadwal untuk tampilan yang di-materialisasi, lihat Scheduled updates for materialized views.