全部产品
Search
文档中心

AnalyticDB:CREATE MATERIALIZED VIEW

更新时间:Feb 06, 2026

Topik ini menjelaskan pernyataan CREATE MATERIALIZED VIEW, yang dapat digunakan untuk membuat tampilan yang di-materialisasi yang mendukung refresh lengkap atau cepat serta mengonfigurasi jadwal refresh-nya.

Sintaksis

CREATE [OR REPLACE] MATERIALIZED VIEW mv_name
[mv_definition]
[mv_properties]
[REFRESH {COMPLETE|FAST}]
[ON {DEMAND|OVERWRITE}]
[START WITH date] [NEXT date]
[{DISABLE|ENABLE} QUERY REWRITE]
[COMMENT 'view_comment']
AS 
query_body

mv_definition:
  ({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'column_comment']
  | table_constraints}
  [, ... ])
  [table_attribute]
  [partition_options]
  [index_all]
  [storage_policy]
  [block_size]
  [engine]
  [table_properties]

Parameter

OR REPLACE

Opsional

Dapat diubah setelah pembuatan: tidak

Hanya kluster AnalyticDB for MySQL versi V3.1.4.7 atau lebih baru yang mendukung parameter ini.
  • Jika tidak ada tampilan yang di-materialisasi yang menggunakan nama yang sama, AnalyticDB for MySQL akan membuat tampilan yang di-materialisasi baru.

  • Jika sudah ada tampilan yang di-materialisasi dengan nama yang sama, AnalyticDB for MySQL akan membuat tampilan sementara untuk menulis data baru dan menggantikan tampilan aslinya setelah data selesai ditulis.

mv_definition

Opsional

Dapat diubah setelah pembuatan: tidak

Anda dapat mendefinisikan struktur tampilan yang di-materialisasi.

Anda dapat memilih apakah akan secara eksplisit mendefinisikan skema tampilan yang di-materialisasi. Jika Anda tidak secara eksplisit mendefinisikan skema tersebut, AnalyticDB for MySQL akan menggunakan kolom dari hasil query_body sebagai kolom tampilan yang di-materialisasi, mendefinisikan kunci primer, membuat indeks pada semua kolom, mengonfigurasi penyimpanan data panas, dan menetapkan mesin ke XUANWU.

Untuk mendefinisikan skema secara manual—termasuk kunci distribusi, kunci partisi, kunci primer, indeks, dan kebijakan penyimpanan bertingkat untuk data panas dan dingin—gunakan metode yang sama seperti pada pernyataan CREATE TABLE. Misalnya, jika Anda tidak perlu mengindeks semua kolom, gunakan kata kunci INDEX untuk menentukan kolom mana yang akan diindeks. Untuk mengurangi biaya penyimpanan, atur kebijakan penyimpanan menjadi penyimpanan campuran data panas-dingin atau simpan hanya data satu tahun terakhir.

Aturan kunci primer
  • Refresh lengkap: Jika Anda tidak secara eksplisit mendefinisikan kunci primer, AnalyticDB for MySQL akan secara otomatis menghasilkan kolom bernama __adb_auto_id__ dan menggunakannya sebagai kunci primer. Untuk mendefinisikan kunci primer secara eksplisit, pilih kolom apa pun dari hasil query_body.

  • Refresh cepat: Baik didefinisikan secara eksplisit maupun dihasilkan otomatis, kunci primer harus mengikuti aturan berikut:

    • Untuk kueri agregat bergrup (dengan GROUP BY), kunci primer harus berupa kolom-kolom dalam klausa GROUP BY. Misalnya, jika GROUP BY a,b, maka kunci primernya harus kolom a dan b.

    • Untuk kueri agregat tanpa grup (tanpa GROUP BY), kunci primer harus berupa konstanta.

    • Untuk kueri non-agregat, kunci primer harus persis sama dengan kunci primer tabel dasar. Misalnya, jika kunci primer tabel dasar adalah PRIMARY KEY(sale_id,sale_date), maka kunci primer tampilan yang di-materialisasi juga harus PRIMARY KEY(sale_id,sale_date).

Rekomendasi

Untuk mengoptimalkan kinerja kueri, definisikan kunci primer, kunci distribusi, dan kunci partisi saat membuat tampilan yang di-materialisasi.

mv_properties

Opsional

Dapat diubah setelah pembuatan: ya (menggunakan pernyataan ALTER MATERIALIZED VIEW)

Hanya kluster AnalyticDB for MySQL Edisi Perusahaan, Edisi Dasar, atau Edisi Data Lakehouse versi V3.1.9.3 atau lebih baru yang mendukung parameter ini.

Kebijakan resource untuk tampilan yang di-materialisasi, termasuk kelompok sumber daya yang digunakan (mv_resource_group) dan petunjuk konfigurasi untuk tugas refresh (mv_refresh_hints). Parameter ini menggunakan format JSON. Contoh:

MV_PROPERTIES='{
  "mv_resource_group":"<resource_group_name>",
  "mv_refresh_hints":{"<hint_name>":"<hint_value>"}
}'
mv_resource_group

Kelompok sumber daya yang digunakan untuk membuat dan merefresh tampilan yang di-materialisasi. Jika Anda tidak menentukannya, kelompok sumber daya default user_default akan digunakan.

Anda dapat mengaturnya ke kelompok sumber daya interaktif atau kelompok sumber daya pekerjaan yang didukung mesin XIHE. Kelompok sumber daya pekerjaan memerlukan waktu beberapa detik hingga menit untuk menyediakan sumber daya. Jika Anda dapat menerima latensi refresh yang lebih tinggi, gunakan kelompok sumber daya pekerjaan. Tampilan yang di-materialisasi yang menggunakan kelompok sumber daya pekerjaan disebut tampilan yang di-materialisasi elastis. Untuk meningkatkan kecepatan refresh tampilan yang di-materialisasi elastis, konfigurasikan elastic_job_max_acu dalam mv_refresh_hints untuk meningkatkan batas maksimum sumber daya. Lihat contoh tampilan yang di-materialisasi elastis.

Anda dapat melihat kelompok sumber daya yang tersedia di halaman Resource Groups di Konsol atau panggil operasi DescribeDBResourceGroup.

Jika kelompok sumber daya yang ditentukan tidak ada, kesalahan akan terjadi saat Anda membuat tampilan yang di-materialisasi.

mv_refresh_hints

Menentukan parameter konfigurasi untuk tampilan yang di-materialisasi. Untuk daftar parameter yang didukung beserta penggunaannya, lihat Common Hints.

REFRESH [COMPLETE | FAST]

Opsional

Nilai default: COMPLETE

Dapat diubah setelah pembuatan: tidak

Kebijakan refresh untuk tampilan yang di-materialisasi. Untuk perbedaan antar kebijakan dan skenario penggunaannya, lihat Cara memilih kebijakan refresh.

COMPLETE

Refresh lengkap menjalankan SQL kueri asli setiap kali, memindai semua partisi target dari tabel dasar, dan menimpa data lama dengan data yang baru dihitung.

Refresh lengkap mendukung mekanisme pemicu berikut: refresh manual sesuai permintaan, refresh otomatis terjadwal (ON DEMAND [START WITH date] [NEXT date]), dan refresh otomatis saat tabel dasar ditimpa (ON OVERWRITE).

FAST
Hanya kluster AnalyticDB for MySQL versi V3.1.9.0 atau lebih baru yang mendukung parameter ini. Versi V3.1.9.0 hanya mendukung tampilan yang di-materialisasi satu tabel dengan refresh cepat. Versi V3.2.0.0 atau lebih baru mendukung tampilan yang di-materialisasi satu tabel maupun multi-tabel dengan refresh cepat.

Refresh cepat menulis ulang kueri tampilan yang di-materialisasi (query_body) untuk hanya memindai data yang berubah di tabel dasar (INSERT, DELETE, UPDATE), memprosesnya, lalu menulisnya ke tampilan yang di-materialisasi. Hal ini menghindari pemindaian seluruh data tabel dasar dan mengurangi beban komputasi per refresh.

Sebelum membuat tampilan yang di-materialisasi dengan refresh cepat, aktifkan binary logging untuk kluster dan tabel dasar. Jika tidak, pembuatan akan gagal. Lihat Aktifkan binary logging.

Tampilan yang di-materialisasi dengan refresh cepat harus menggunakan refresh otomatis terjadwal. Tentukan waktu refresh berikutnya menggunakan ON DEMAND {NEXT date}.

Tampilan yang di-materialisasi dengan refresh cepat memiliki batasan tertentu. Jika query_body tidak mendukung refresh cepat, pembuatan akan gagal.

ON [DEMAND | OVERWRITE]

Opsional

Nilai default: DEMAND

Dapat diubah setelah pembuatan: tidak

Mekanisme pemicu refresh untuk tampilan yang di-materialisasi. Untuk perbedaan antar mekanisme dan skenario penggunaannya, lihat Cara memilih mekanisme pemicu refresh.

DEMAND

Refresh sesuai permintaan. Picu refresh secara manual atau gunakan klausa NEXT untuk menjadwalkan refresh otomatis.

Tampilan yang di-materialisasi dengan refresh cepat hanya mendukung ON DEMAND.

OVERWRITE

Refresh otomatis saat tabel dasar ditimpa oleh pernyataan INSERT OVERWRITE.

Jika Anda mengatur mekanisme pemicu ke ON OVERWRITE, jangan tentukan START WITH atau NEXT.

[START WITH date] [NEXT date]

Opsional

Dapat diubah setelah pembuatan: tidak

Tentukan waktu refresh hanya ketika mekanisme pemicunya adalah ON DEMAND. Jika Anda tidak menentukan waktu, tidak akan ada refresh terjadwal.

START WITH

Waktu refresh pertama. Jika dihilangkan, refresh pertama terjadi saat pembuatan.

NEXT

Waktu refresh berikutnya.

  • Untuk tampilan yang di-materialisasi dengan refresh cepat, Anda harus menentukan NEXT. Intervalnya harus antara 5 detik hingga 5 menit.

  • Untuk tampilan yang di-materialisasi dengan refresh lengkap, NEXT bersifat opsional. Jika ditentukan, intervalnya minimal 60 detik.

date

Fungsi waktu didukung tetapi harus akurat hingga detik. Milidetik akan dipotong.

[DISABLE | ENABLE] QUERY REWRITE

Opsional

Nilai default: DISABLE

Dapat diubah setelah pembuatan: ya (menggunakan pernyataan ALTER MATERIALIZED VIEW)

Parameter ini hanya didukung oleh versi 3.1.4 dan lebih baru.

Mengaktifkan atau menonaktifkan penulisan ulang kueri untuk tampilan yang di-materialisasi. Untuk detailnya, lihat Penulisan ulang kueri untuk tampilan yang di-materialisasi.

DISABLE

Menonaktifkan penulisan ulang kueri untuk tampilan yang di-materialisasi.

ENABLE

Mengaktifkan penulisan ulang kueri untuk tampilan yang di-materialisasi. Setelah diaktifkan, pengoptimal akan menulis ulang kueri secara penuh atau sebagian berdasarkan pola SQL dan mengarahkannya ke tampilan yang di-materialisasi. Hal ini menghindari komputasi pada tabel dasar dan meningkatkan kinerja kueri.

query_body

Wajib

Dapat diubah setelah pembuatan: tidak

Kueri tabel dasar untuk tampilan yang di-materialisasi.

Untuk tampilan yang di-materialisasi dengan refresh penuh, tabel dasarnya dapat berupa tabel internal, tabel eksternal, tampilan yang di-materialisasi yang sudah ada, dan tampilan di AnalyticDB for MySQL. Tidak ada batasan pada kueri tabel dasar. Untuk informasi lebih lanjut tentang sintaksis kueri, lihat SELECT.

Untuk tampilan yang di-materialisasi dengan refresh bertahap, tabel dasarnya hanya dapat berupa tabel internal di AnalyticDB for MySQL. Kueri tabel dasar harus mengikuti aturan berikut:

SELECT kolom output

  • Untuk kueri agregasi bergrup (kueri agregat dengan klausa GROUP BY), kolom output dalam daftar SELECT harus mencakup semua kolom pengelompokan dari klausa GROUP BY.

    Klik untuk melihat contoh

    Contoh benar

    Contoh salah

    CREATE MATERIALIZED VIEW demo_mv1
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT 
      sale_id, -- Output kolom pengelompokan.
      sale_date, -- Output kolom pengelompokan.
      max(quantity) AS max, -- Alias harus ditentukan untuk kolom ekspresi.
      sum(price)AS sum
    FROM sales
    GROUP BY sale_id,sale_date;
    CREATE MATERIALIZED VIEW false_mv1
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT 
      sale_id, -- Kolom pengelompokan sale_date tidak ada dalam output.
      max(quantity) AS max,
      sum(price)AS sum
    FROM sales
    GROUP BY sale_id,sale_date;
  • Untuk kueri agregat tanpa pengelompokan (kueri agregat tanpa klausa GROUP BY), daftar SELECT hanya boleh mengoutput kolom konstan dan kolom agregat, atau hanya kolom agregat.

    Klik untuk melihat contoh

    Contoh benar

    Contoh salah

    Mengoutput hanya kolom agregat `max` dan `sum`.

    CREATE MATERIALIZED VIEW demo_mv2
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT 
      max(quantity) AS max, -- Alias harus ditentukan untuk kolom ekspresi.
      sum(price)AS sum
    FROM sales;

    Mengoutput kolom selain kolom konstan dan kolom agregat.

    CREATE MATERIALIZED VIEW false_mv2
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id, 
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales;

    Mengoutput kolom konstan `pk` dan kolom agregat `max` serta `sum`.

    CREATE MATERIALIZED VIEW demo_mv3
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT 
      1 AS pk,  -- Dalam agregasi tanpa pengelompokan, kolom konstan digunakan sebagai kunci primer tampilan yang di-materialisasi.
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales;
  • Untuk kueri non-agregat, daftar SELECT harus mengoutput semua kolom kunci primer dari tabel dasar.

    Klik untuk melihat contoh

    Contoh benar

    Contoh salah

    CREATE MATERIALIZED VIEW demo_mv4
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT 
      sale_id, -- Output kolom kunci primer tabel dasar.
      quantity
    FROM sales;
    CREATE MATERIALIZED VIEW false_mv3
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT 
      sale_date, -- Kolom kunci primer sale_id tabel dasar tidak ada dalam output.
      quantity
    FROM sales;

    Asumsikan tabel `sales1` memiliki kunci primer gabungan `PRIMARY KEY(sale_id,sale_date)`.

    CREATE MATERIALIZED VIEW demo_mv5
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT 
      sale_id, -- Output kolom kunci primer tabel dasar.
      sale_date, -- Output kolom kunci primer tabel dasar.
      quantity
    FROM sales1;

    Asumsikan tabel `sales1` memiliki kunci primer gabungan `PRIMARY KEY(sale_id,sale_date)`.

    CREATE MATERIALIZED VIEW false_mv4
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT 
      sale_id, -- Kolom kunci primer lainnya sale_date tabel dasar tidak ada dalam output.
      quantity
    FROM sales1;
  • Tentukan alias untuk setiap kolom ekspresi dalam output. Gunakan alias yang bermakna, seperti SUM(price) AS total_price.

Batasan lainnya

  • Ekspresi non-deterministik, seperti `NOW()` dan `RAND()`, tidak didukung.

  • Operasi pengurutan `ORDER BY` tidak didukung.

  • Klausa `HAVING` tidak didukung.

  • Fungsi jendela tidak didukung.

  • Operasi himpunan, seperti `UNION`, `EXCEPT`, dan `INTERSECT`, tidak didukung.

  • Hanya operasi `INNER JOIN` yang didukung. Kolom join harus memenuhi semua kondisi berikut: kolom tersebut harus merupakan kolom asli dari tabel, memiliki tipe data yang sama, dan memiliki indeks. Anda dapat melakukan join maksimal lima tabel.

    Untuk menggabungkan lebih banyak tabel, guna menghubungi dukungan teknis.
  • Hanya fungsi agregat berikut yang didukung: `COUNT`, `SUM`, `MAX`, `MIN`, `AVG`, `APPROX_DISTINCT`, dan `COUNT(DISTINCT)`.

  • `AVG` tidak mendukung tipe data DECIMAL.

  • `COUNT(DISTINCT)` hanya mendukung tipe data INTEGER.

Izin yang diperlukan

Untuk membuat tampilan yang di-materialisasi, pengguna harus memiliki semua izin berikut:

  • Izin CREATE pada database tempat tampilan yang di-materialisasi akan dibuat.

  • Izin SELECT pada kolom terkait atau seluruh tabel dasar tampilan yang di-materialisasi.

  • Jika ingin membuat tampilan yang di-materialisasi dengan refresh otomatis, Anda juga memerlukan izin berikut:

    • Izin untuk menghubungkan ke AnalyticDB for MySQL dari alamat IP mana pun ('%').

    • Izin INSERT pada tampilan itu sendiri atau pada semua tabel dalam database-nya, yang diperlukan untuk merefresh data dalam tampilan yang di-materialisasi.

Contoh

Persiapan contoh

Contoh tampilan yang di-materialisasi berikut menggunakan tabel dasar yang didefinisikan dalam bagian ini. Untuk mencoba contohnya, jalankan terlebih dahulu pernyataan SQL berikut untuk membuat tabel dasar.

/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Menentukan XUANWU sebagai mesin tabel.
CREATE TABLE customer (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(255),
    is_vip Boolean
);
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Menentukan XUANWU sebagai mesin tabel.
CREATE TABLE sales (
    sale_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    price DECIMAL(10, 2),
    quantity INT,
    sale_date TIMESTAMP
);

Refresh Penuh Tampilan yang Di-Materialisasi

  • Buat tampilan yang di-materialisasi bernama myview1 yang direfresh setiap 5 menit.

    CREATE MATERIALIZED VIEW myview1
    REFRESH   -- Setara dengan REFRESH COMPLETE.
     NEXT now() + INTERVAL 5 minute
    AS
    SELECT count(*) as cnt FROM customer;
  • Buat tampilan yang di-materialisasi bernama myview2 yang direfresh setiap hari pukul 02:00:00.

    CREATE MATERIALIZED VIEW myview2
    REFRESH COMPLETE
     START WITH DATE_FORMAT(now() + INTERVAL 1 day, '%Y-%m-%d 02:00:00')
     NEXT DATE_FORMAT(now() + INTERVAL 1 day, '%Y-%m-%d 02:00:00')
    AS
    SELECT count(*) as cnt FROM customer;
  • Buat tampilan yang di-materialisasi bernama myview3 yang direfresh setiap hari Senin pukul 02:00:00.

    CREATE MATERIALIZED VIEW myview3
    REFRESH COMPLETE ON DEMAND
     START WITH DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') 
     NEXT DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00')
    AS
    SELECT count(*) as cnt FROM customer;
  • Buat tampilan yang di-materialisasi bernama myview4 yang direfresh pada hari pertama setiap bulan pukul 02:00:00.

    CREATE MATERIALIZED VIEW myview4
    REFRESH   -- Setara dengan REFRESH COMPLETE. 
     NEXT DATE_FORMAT(last_day(now()) + INTERVAL 1 day, '%Y-%m-%d 02:00:00')
    AS
    SELECT count(*) as cnt FROM customer;
  • Buat tampilan yang di-materialisasi bernama myview5 yang hanya direfresh sekali.

    CREATE MATERIALIZED VIEW myview5
    REFRESH   -- Setara dengan REFRESH COMPLETE.
     START WITH now() + INTERVAL 1 day
    AS 
    SELECT count(*) as cnt FROM customer;
  • Buat tampilan yang di-materialisasi bernama myview6 yang tidak direfresh secara otomatis. Refresh secara manual.

    CREATE MATERIALIZED VIEW myview6 (
      PRIMARY KEY (customer_id)
    ) DISTRIBUTED BY HASH (customer_id)
    AS
    SELECT customer_id FROM customer;

    Refresh tampilan yang di-materialisasi secara manual:

    REFRESH MATERIALIZED VIEW myview6;
  • Buat tampilan yang di-materialisasi bernama myview7 yang direfresh secara otomatis saat tabel dasar ditimpa. Tidak perlu refresh manual.

    CREATE MATERIALIZED VIEW myview7
    REFRESH COMPLETE ON OVERWRITE
    AS
    SELECT count(*) as cnt FROM customer;

Buat tampilan yang di-materialisasi satu tabel yang mendukung refresh cepat

Sebelum membuat tampilan yang di-materialisasi yang mendukung refresh cepat, aktifkan binary logging untuk kluster dan tabel dasar.
SET ADB_CONFIG BINLOG_ENABLE=true;
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
  • Buat tampilan yang di-materialisasi satu tabel bernama fast_mv1 yang mendukung refresh cepat dengan interval 10 detik. Kueri tampilan yang di-materialisasi tidak melibatkan fungsi agregat.

    CREATE MATERIALIZED VIEW fast_mv1
    REFRESH FAST NEXT now() + INTERVAL 10 second
    AS
    SELECT sale_id, sale_date, price
    FROM sales
    WHERE price > 10;
  • Buat tampilan yang di-materialisasi satu tabel bernama fast_mv2 yang mendukung refresh cepat dengan interval 5 detik. Kueri tampilan yang di-materialisasi melibatkan fungsi agregat dengan GROUP BY.

    CREATE MATERIALIZED VIEW fast_mv2
    REFRESH FAST NEXT now() + INTERVAL 5 second
    AS
    SELECT
       customer_id, sale_date,                 -- Sistem menggunakan kolom GROUP BY sebagai kunci primer tampilan yang di-materialisasi. 
       COUNT(sale_id) AS cnt_sale_id,          -- Melakukan operasi agregat pada kolom. 
       SUM(price * quantity) AS total_revenue, -- Melakukan operasi agregat pada kolom. 
       customer_id / 100 AS new_customer_id    -- Anda dapat menggunakan ekspresi untuk mendefinisikan kolom yang tidak terlibat dalam operasi agregat. 
    FROM sales
    WHERE ifnull(price, 1) > 0                 -- Anda dapat menggunakan ekspresi untuk mendefinisikan kondisi WHERE. 
    GROUP BY customer_id, sale_date;
  • Buat tampilan yang di-materialisasi satu tabel bernama fast_mv3 yang mendukung refresh cepat dengan interval 1 menit. Kueri tampilan yang di-materialisasi melibatkan fungsi agregat tanpa GROUP BY.

    CREATE MATERIALIZED VIEW fast_mv3
    REFRESH FAST NEXT now() + INTERVAL 1 minute
    AS
    SELECT count(*) AS cnt   -- Sistem menghasilkan konstanta sebagai kunci primer untuk memastikan hanya satu catatan yang ada dalam tampilan yang di-materialisasi. 
    FROM sales;

Buat tampilan yang di-materialisasi multi-tabel yang mendukung refresh cepat

  • Buat tampilan yang di-materialisasi multi-tabel bernama fast_mv4 yang mendukung refresh cepat dengan interval 5 detik dan tidak menggunakan agregasi.

    CREATE MATERIALIZED VIEW fast_mv4
    REFRESH FAST NEXT now() + INTERVAL 5 second
    AS
    SELECT 
        c.customer_id,
        c.customer_name,
        s.sale_id,
        (s.price * s.quantity) AS revenue
    FROM 
        sales s
    JOIN 
        customer c ON s.customer_id = c.customer_id;
  • Buat tampilan yang di-materialisasi multi-tabel bernama fast_mv5 yang mendukung refresh cepat dengan interval 10 detik dan menggunakan agregasi bergrup.

    CREATE MATERIALIZED VIEW fast_mv5
    REFRESH FAST NEXT now() + INTERVAL 10 second
    AS
    SELECT 
        s.sale_id,
        c.customer_name,
        COUNT(*) AS cnt,           
        SUM(s.price * s.quantity) AS revenue                
    FROM 
        sales s
    JOIN 
        (SELECT customer_id, customer_name FROM customer) c ON c.customer_id = s.customer_id
    GROUP BY 
        s.sale_id, c.customer_name;

Tampilan yang di-materialisasi terpartisi

Buat tampilan yang di-materialisasi bernama myview8 dengan kunci distribusi dan kunci partisi.

CREATE MATERIALIZED VIEW myview8 (
  quantity INT,    -- Tampilan yang di-materialisasi mencakup semua kolom dari hasil kueri meskipun tidak ada kolom yang ditampilkan secara eksplisit.     
  price DECIMAL(10, 2),
  sale_date TIMESTAMP
) 
DISTRIBUTED BY HASH(sale_id)
PARTITION BY VALUE(date_format(sale_date, "%Y%m%d")) LIFECYCLE 30
AS 
SELECT * FROM sales;

Definisikan secara eksplisit kunci primer, kunci distribusi, indeks, dll.

  • Buat tampilan yang di-materialisasi bernama myview9 yang hanya mengindeks kolom customer_name.

    CREATE MATERIALIZED VIEW myview9 (
      INDEX (sale_date),
      PRIMARY KEY (sale_id)
    ) DISTRIBUTED BY HASH (sale_id)
    REFRESH
     NEXT now() + INTERVAL 1 DAY
    AS
    SELECT * FROM sales;
  • Buat tampilan yang di-materialisasi bernama myview10 yang mendefinisikan kunci primer, kunci distribusi, indeks terkluster, indeks berbasis kolom, dan komentar.

    CREATE MATERIALIZED VIEW myview10 (
      quantity INT,    -- Tampilan yang di-materialisasi mencakup semua kolom dari hasil kueri meskipun tidak ada kolom yang ditampilkan secara eksplisit.     
      price DECIMAL(10, 2),
      KEY INDEX_ID(customer_id) COMMENT 'customer',
      CLUSTERED KEY INDEX(sale_id),
      PRIMARY KEY(sale_id,sale_date)
    ) 
    DISTRIBUTED BY HASH(sale_id)
    COMMENT 'MATERIALIZED VIEW c'
    AS 
    SELECT * FROM sales;

Tampilan yang Di-Materialisasi Elastis

  • Buat tampilan yang di-materialisasi elastis bernama myview11 yang menggunakan kelompok sumber daya pekerjaan arsitektur tanpa server dan direfresh setiap hari.

    CREATE MATERIALIZED VIEW myview11
    MV_PROPERTIES='{
      "mv_resource_group":"serverless"
    }'
    REFRESH COMPLETE ON DEMAND
     START WITH now()
     NEXT now() + INTERVAL 1 DAY
    AS
    SELECT * FROM sales;
  • Buat tampilan yang di-materialisasi elastis bernama myview12 yang menggunakan kelompok sumber daya pekerjaan arsitektur tanpa server dan dapat mengonsumsi hingga 12 ACU.

    CREATE MATERIALIZED VIEW myview12
    MV_PROPERTIES='{
      "mv_resource_group":"serverless",
      "mv_refresh_hints":{"elastic_job_max_acu":"12"}
    }'
    REFRESH COMPLETE ON DEMAND
     START WITH now()
     NEXT now() + INTERVAL 1 DAY
    AS
    SELECT * FROM sales;

Referensi