All Products
Search
Document Center

MaxCompute:Penulisan ulang kueri tampilan yang di-materialisasi

Last Updated:Sep 17, 2026

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 JOIN atau UNION 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

  1. Buat tampilan yang di-materialisasi.

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

    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.

  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 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 a dan b, sehingga kolom b tidak dapat di-agregasi lagi.

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

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

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

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

    Penulisan ulang gagal karena kolom a memerlukan agregasi tambahan.

Example 3: Rewrite with a JOIN clause

Rewrite JOIN inputs

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

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

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

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

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

  1. Scenario

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

    Ketika pernyataan kueri ini dieksekusi, MaxCompute secara otomatis mencocokkan tampilan yang di-materialisasi count_mv dan membaca data yang telah di-agregasi 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 penulisan ulang kueri berhasil.

Related documents