All Products
Search
Document Center

MaxCompute:CREATE MATERIALIZED VIEW

Last Updated:Jul 06, 2025

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.

SELECT empid, deptname  
FROM emps JOIN depts 
ON emps.deptno=depts.deptno 
WHERE hire_date >= '2018-01-01';

Data dikueri berdasarkan tampilan materialized yang Anda buat.

Pernyataan yang digunakan untuk membuat tampilan materialized:

CREATE MATERIALIZED VIEW mv 
AS SELECT empid, deptname, hire_date  
FROM emps JOIN depts 
ON emps.deptno=depts.deptno 
WHERE hire_date >= '2016-01-01';

Pernyataan yang digunakan untuk mengkueri data berdasarkan tampilan materialized yang Anda buat:

SELECT empid, deptname FROM mv 
WHERE hire_date >= '2018-01-01';

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:

SELECT empid, deptname 
FROM emps JOIN depts 
ON emps.deptno=depts.deptno 
WHERE hire_date >= '2018-01-01';
-- Pernyataan di atas setara dengan pernyataan berikut: 
SELECT empid, deptname FROM mv 
WHERE hire_date >= '2018-01-01';

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.

Catatan

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 ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE; untuk menonaktifkan operasi penulisan ulang kueri yang dilakukan berdasarkan tampilan materialized. Anda juga dapat mengeksekusi pernyataan ALTER MATERIALIZED VIEW [project_name.]<mv_name> ENABLE REWRITE; untuk mengaktifkan operasi penulisan ulang kueri yang dilakukan berdasarkan tampilan materialized.

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

  • compressionstrategy menentukan kebijakan kompresi untuk penyimpanan data tampilan materialized yang ingin Anda buat. Nilai valid: normal, high, dan extreme. enable_auto_substitute menentukan apakah akan secara otomatis mengkueri data dari tabel sumber jika tampilan materialized tidak mengandung partisi yang ingin Anda kueri. Untuk informasi lebih lanjut, lihat Kueri dan penulisan ulang untuk tampilan materialized.

  • enable_auto_refresh: opsional. Atur parameter ini ke true jika Anda ingin sistem memperbarui data secara otomatis.

  • refresh_interval_minutes: kondisional opsional. Jika enable_auto_refresh disetel ke true, Anda perlu mengonfigurasi parameter ini. Unit: menit.

  • only_refresh_max_pt: opsional. Parameter ini valid untuk tampilan materialized yang dipartisi. Jika parameter ini disetel ke true, data partisi terbaru di tabel sumber diperbarui ke tampilan materialized.

select_statement

Ya

Pernyataan SELECT. Untuk informasi lebih lanjut tentang sintaksis pernyataan SELECT, lihat Sintaksis SELECT.

Contoh

Membuat tampilan materialized

  1. Buat tabel bernama mf_t dan mf_t1 dan 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          |
    +------------+------------+------------+------------+
  2. 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.

  1. Buat tampilan materialized dengan pernyataan berikut:

    CREATE MATERIALIZED VIEW count_mv AS SELECT page_id, count(*) FROM visit_records GROUP BY page_id;
  2. 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.

  3. 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)
    
    
    OK

    Data 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.

Catatan

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

  1. Buat tampilan materialized dengan pernyataan berikut:

    CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5;
  2. 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.

    1. 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;
    2. 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.

    1. 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;
    2. 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

    1. 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;
    2. 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

    1. 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;
    2. 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

    1. 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;
    2. 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;
Catatan
  • 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

  1. 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;
  2. 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

  1. 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;
  2. 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.

  1. 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;
  2. Kueri data partisi 20210101 dalam tabel src dari tampilan materialized mv.

    SELECT * FROM mv WHERE dt='20210101';
  3. 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;
  4. 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.