All Products
Search
Document Center

MaxCompute:CREATE MATERIALIZED VIEW

Last Updated:Sep 17, 2026

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.

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

Buat Tampilan yang di-materialisasi, lalu kueri tampilan tersebut.

Pernyataan berikut membuat Tampilan yang di-materialisasi:

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';

Kueri Tampilan yang di-materialisasi:

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

Jika query rewrite diaktifkan untuk Tampilan yang di-materialisasi, sistem secara otomatis menggunakan Tampilan yang di-materialisasi saat Anda menjalankan kueri berikut:

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

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.

Catatan

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.

  1. Login ke Konsol MaxCompute dan pilih Wilayah di pojok kiri atas.

  2. Di panel navigasi sebelah kiri, pilih Manage Configurations > Projects.

    Lihat nama proyek Anda.

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 ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE; untuk menonaktifkan query rewrite, dan menjalankan ALTER MATERIALIZED VIEW [project_name.]<mv_name> ENABLE REWRITE; untuk mengaktifkannya.

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

  • compressionstrategy: Menentukan strategi kompresi penyimpanan data. Nilai yang valid adalah normal, high, dan extreme. enable_auto_substitute: Menentukan apakah akan mengaktifkan query passthrough ke tabel partisi sumber saat partisi tidak ada. Untuk informasi selengkapnya, lihat Query rewrite Tampilan yang di-materialisasi.

  • enable_auto_refresh: Opsional. Atur properti ini ke true untuk mengaktifkan refresh data otomatis.

  • refresh_interval_minutes: Parameter ini hanya diperlukan jika enable_auto_refresh diatur ke true. Parameter ini menentukan interval refresh dalam menit.

  • only_refresh_max_pt: Opsional. Properti ini hanya berlaku untuk Tampilan yang di-materialisasi partisi. Jika diatur ke true, hanya partisi terbaru dari tabel sumber yang direfresh.

select_statement

Ya

Pernyataan SELECT yang mendefinisikan Tampilan yang di-materialisasi. Untuk informasi selengkapnya, lihat Sintaks SELECT.

Contoh

Buat Tampilan yang di-materialisasi

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

  1. Skenario

    Pertimbangkan tabel kunjungan halaman bernama visit_records yang 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_records yang 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_records adalah sebagai berikut:

    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | page_id         | string     |       |                                             |
    | user_id         | string     |       |                                             |
    | visit_time      | string     |       |                                             |
    +------------------------------------------------------------------------------------+
  2. 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;
  3. 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_mv dan membaca data yang telah diagregasi sebelumnya dari count_mv.

  4. Untuk memverifikasi bahwa kueri ditulis ulang menggunakan Tampilan yang di-materialisasi, jalankan perintah EXPLAIN berikut:

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

    Data source dalam hasil yang dikembalikan menunjukkan bahwa tabel yang dibaca oleh kueri adalah doc_test_dev project's count_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.

Catatan

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

  1. Buat Tampilan yang di-materialisasi.

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

    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.

  1. 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;
  2. 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 a dan b, sehingga kolom b tidak dapat diagregasi lagi.

    SELECT a, count(c) FROM src GROUP BY a;

    Rewrite gagal karena re-agregasi fungsi COUNT tidak 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.

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

    SELECT a, count(DISTINCT c) FROM src GROUP BY a;

    Rewrite gagal karena kolom a memerlukan agregasi tambahan.

Contoh 3: Rewrite dengan klausa JOIN

Menulis Ulang input JOIN

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

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

  1. Buat Tampilan yang di-materialisasi.

    CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a;
  2. 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

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

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

  1. 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;
  2. Kueri data dari partisi 20210101 dalam Tampilan yang di-materialisasi mv.

    SELECT * FROM mv WHERE dt='20210101';
  3. Kueri data dari partisi 20210102 dalam Tampilan yang di-materialisasi mv. 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;
  4. 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 operasi UNION sebelum 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.