全部产品
Search
文档中心

AnalyticDB:Penulisan ulang kueri dari tampilan materialized

更新时间:Jul 06, 2025

AnalyticDB for MySQL memungkinkan Anda menanyakan tampilan materialized dan menyediakan fitur penulisan ulang kueri. Fitur ini secara otomatis menulis ulang kueri untuk menggunakan tampilan materialized, membantu meningkatkan performa kueri. Topik ini menjelaskan cara menggunakan fitur penulisan ulang kueri dari tampilan materialized.

Prasyarat

  • Sebuah kluster AnalyticDB for MySQL versi V3.1.4.0 atau yang lebih baru telah dibuat.

    Catatan
  • Izin berikut diperlukan untuk menggunakan tampilan materialized:

    • Izin CREATE pada tabel dalam database tempat Anda ingin membuat tampilan materialized.

Ikhtisar

Anda dapat langsung menanyakan tampilan materialized atau mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized. Setelah diaktifkan, kueri yang tidak merujuk ke tampilan materialized dapat ditulis ulang untuk menggunakan tampilan tersebut. Dalam hal ini, tampilan materialized digunakan sebagai cache untuk mempercepat kueri tanpa perlu memodifikasi pernyataan SQL. AnalyticDB for MySQL memungkinkan Anda menulis ulang kueri yang memiliki struktur sama dengan tampilan materialized dan menggunakan aturan penulisan ulang untuk menulis ulang kueri yang setara.

  • Metode Penulisan Ulang Kueri

    AnalyticDB for MySQL memeriksa apakah struktur pernyataan kueri sama dengan struktur tampilan materialized dan memilih metode penulisan ulang yang sesuai berdasarkan hasil pemeriksaan. AnalyticDB for MySQL mendukung metode penulisan ulang berikut:

    • Penulisan Ulang Kecocokan Tepat

      Jika struktur pernyataan kueri persis sama dengan struktur tampilan materialized, AnalyticDB for MySQL menulis ulang pernyataan kueri untuk menggunakan tampilan materialized. Ini adalah metode dasar dengan sedikit batasan. Untuk informasi tentang batasan, lihat bagian "Batasan".

    • Penulisan Ulang Kueri Tingkat Lanjut

      Jika struktur pernyataan kueri berbeda dari struktur tampilan materialized, AnalyticDB for MySQL menggunakan aturan penulisan ulang untuk memeriksa apakah tampilan materialized berisi data yang diperlukan untuk kueri. AnalyticDB for MySQL mencoba menulis ulang setiap bagian dari kueri dan subkueri. Bagian-bagian yang berbeda dari kueri mungkin menggunakan tampilan materialized yang berbeda. Untuk informasi tentang rentang penulisan ulang yang didukung dan batasan metode penulisan ulang kueri tingkat lanjut, lihat bagian "Rentang Penulisan Ulang" dan "Batasan".

  • Tingkat Penulisan Ulang Kueri

    AnalyticDB for MySQL hanya mendukung penulisan ulang kueri pada level STALE_TOLERATED. Kueri dapat ditulis ulang untuk menggunakan tampilan materialized guna meningkatkan performa meskipun tampilan materialized berisi data usang yang mungkin tidak mencerminkan data terbaru dari tabel dasar. Tingkat STALE_TOLERATED menawarkan kemampuan penulisan ulang maksimum tetapi dapat menghasilkan hasil kueri yang tidak akurat. Sebelum menggunakan fitur penulisan ulang kueri, disarankan untuk memperbarui tampilan materialized agar mendapatkan hasil terbaru. Untuk informasi lebih lanjut, lihat Konfigurasikan Pembaruan Penuh untuk Tampilan Materialized.

Menggunakan fitur penulisan ulang kueri

Aktifkan fitur penulisan ulang kueri

AnalyticDB for MySQL memungkinkan Anda menggunakan salah satu metode berikut untuk mengaktifkan fitur penulisan ulang kueri:

  • Saat membuat tampilan materialized, tentukan klausa ENABLE QUERY REWRITE. Untuk informasi lebih lanjut, lihat bagian "Buat Tampilan Materialized".

  • Setelah membuat tampilan materialized, jalankan pernyataan ALTER MATERIALIZED VIEW <mv_name> ENABLE QUERY REWRITE;. Untuk informasi lebih lanjut, lihat Kelola Tampilan Materialized.

Nonaktifkan fitur penulisan ulang kueri

AnalyticDB for MySQL memungkinkan Anda menggunakan salah satu metode berikut untuk menonaktifkan fitur penulisan ulang kueri:

  • Jalankan pernyataan ALTER MATERIALIZED VIEW <mv_name> DISABLE QUERY REWRITE;. Untuk informasi lebih lanjut, lihat Kelola Tampilan Materialized.

  • Tambahkan petunjuk sebelum pernyataan SQL untuk mencegah kueri menggunakan fitur penulisan ulang kueri. Sintaks:

  • /*+MV_QUERY_REWRITE_ENABLED=false*/
    SELECT ...

Contoh

  1. Aktifkan fitur penulisan ulang kueri saat membuat tampilan materialized.

    CREATE MATERIALIZED VIEW adb_mv
    REFRESH START WITH now() + interval 1 day
    ENABLE QUERY REWRITE
    AS
    SELECT course_id,course_name,max(course_grade) AS max_grade FROM tb_courses;
  2. Jalankan kueri.

    SELECT course_id,course_name,max(course_grade) AS max_grade FROM tb_courses;
  3. Jalankan pernyataan EXPLAIN untuk memeriksa apakah fitur penulisan ulang kueri berfungsi.

    EXPLAIN SELECT course_id,course_name,max(course_grade) AS max_grade FROM tb_courses;

    Hasil contoh:

    +---------------+
    | Plan Summary |
    +---------------+
     1- Output[ Query plan ] {Est rowCount: 1.0}
     2    -> Exchange[GATHER] {Est rowCount: 1.0}
     3        - TableScan {table: adb_mv, Est rowCount: 1.0}

    Rencana eksekusi di atas menunjukkan bahwa kueri menggunakan data yang disimpan dalam tampilan materialized adb_mv, bukan data dalam tabel tb_courses.

Batasan

  • Jika tampilan materialized berisi konten yang tidak dapat ditulis ulang, fitur penulisan ulang kueri tidak berfungsi.

    AnalyticDB for MySQL memberlakukan batasan yang berbeda pada fitur penulisan ulang kueri untuk metode penulisan ulang kecocokan tepat dan metode penulisan ulang kueri tingkat lanjut.

    • Jika tampilan materialized berisi konten berikut, metode penulisan ulang kecocokan tepat tidak berfungsi:

      • Fungsi non-deterministik, seperti NOW, CURRENT_TIMESTAMP, dan RANDOM.

      • Fungsi yang ditentukan pengguna (UDF).

    • Jika tampilan materialized berisi konten berikut, metode penulisan ulang kueri tingkat lanjut tidak berfungsi:

      • Klausa ORDER BY, LIMIT, atau OFFSET.

      • Klausa UNION atau UNION ALL.

      • GROUPING SETS, CUBE, atau ROLLUP dalam klausa GROUP BY.

      • Fungsi jendela.

      • Klausa FULL OUTER JOIN.

      • Tabel sistem.

      • Subkueri berkorelasi.

      • Fungsi non-deterministik, seperti NOW, CURRENT_TIMESTAMP, dan RANDOM.

      • UDF.

      • Klausa HAVING.

      • Klausa SELF JOIN.

  • Jika kueri termasuk dalam salah satu pernyataan berikut, fitur penulisan ulang kueri tidak berfungsi:

    • CREATE TABLE AS SELECT.

    • INSERT INTO SELECT.

    • INSERT OVERWRITE SELECT.

    • REPLACE INTO SELECT.

    • DELETE atau UPDATE.

  • Skenario Lainnya

    Jika pernyataan kueri tabel tunggal tidak memiliki kondisi filter atau fungsi agregat, fitur penulisan ulang kueri tidak berfungsi.

Rentang Penulisan Ulang

Dalam contoh-contoh berikut, tabel yang sama digunakan. Jalankan pernyataan berikut untuk membuat tabel:

CREATE TABLE part (
  partkey INTEGER NOT NULL,
  name VARCHAR(55) NOT NULL,
  type VARCHAR(25) NOT NULL
);

CREATE TABLE lineitem (
  orderkey BIGINT,
  partkey BIGINT NOT NULL,
  suppkey BIGINT NOT NULL,
  extendedprice DOUBLE NOT NULL,
  discount DOUBLE NOT NULL,
  returnflag CHAR(1) NOT NULL,
  linestatus CHAR(1) NOT NULL,
  shipdate DATE NOT NULL,
  shipmode VARCHAR(25) NOT NULL,
  commitdate DATE NOT NULL,
  receiptdate DATE NOT NULL
);
  
CREATE TABLE orders (
  orderkey BIGINT PRIMARY KEY,
  custkey BIGINT NOT NULL,
  orderstatus VARCHAR(1) NOT NULL,
  totalprice DOUBLE NOT NULL,
  orderdate DATE NOT NULL
);
CREATE TABLE partsupp (
  partkey INTEGER NOT NULL PRIMARY KEY,
  suppkey INTEGER NOT NULL,
  availqty INTEGER NOT NULL,
  supplycost DECIMAL(15,2) NOT NULL
);

Penulisan ulang kecocokan tepat

AnalyticDB for MySQL memeriksa apakah struktur pernyataan kueri sama dengan struktur tampilan materialized. Jika struktur pernyataan kueri dantampilan materialized persis sama, AnalyticDB for MySQL menulis ulang pernyataan kueri untuk menggunakan tampilan materialized.

Contoh

  • Jalankan pernyataan kueri.

    SELECT
      l.returnflag,
      l.linestatus, 
      SUM(l.extendedprice * (1 - l.discount)), 
      COUNT(*) AS count_order
    FROM lineitem AS l 
    GROUP BY l.returnflag, l.linestatus;
  • Buat tampilan materialized.

    CREATE MATERIALIZED VIEW mv0
    REFRESH NEXT now() + interval 1 day
    ENABLE QUERY REWRITE
    AS
    SELECT
      l.returnflag,
      l.linestatus,
      SUM (l.extendedprice * (1 - l.discount)) AS sum_disc_price,
      count(*) AS count_order
    FROM lineitem AS l
    GROUP BY l.returnflag, l.linestatus;
  • Jika Anda menjalankan pernyataan kueri setelah mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized, pernyataan kueri ditulis ulang sebagai berikut:

    SELECT returnflag, linestatus, sum_disc_price, count_order
    FROM mv0;

Penulisan ulang kueri tingkat lanjut

Jika struktur pernyataan kueri berbeda dari struktur tampilan materialized, AnalyticDB for MySQL menggunakan aturan penulisan ulang untuk memeriksa ekspresi FILTER, JOIN, AGGREGATION, dan GROUP BY secara berurutan. Kemudian, AnalyticDB for MySQL mencoba membangun ekspresi kueri yang setara dengan menggunakan tampilan materialized untuk menjawab kueri atau sebagian dari kueri.

Metode penulisan ulang kueri tingkat lanjut mendukung aturan penulisan ulang berikut:

  • FILTER

    Jika predikat pernyataan kueri berbeda dari predikat tampilan materialized, AnalyticDB for MySQL menggunakan aturan FILTER untuk membangun ekspresi kompensasi. Jika ekspresi yang terkandung dalam pernyataan kueri tidak ada dalam tampilan materialized, AnalyticDB for MySQL mencoba menghitung ekspresi dalam tampilan materialized. Contoh:

    • Jalankan pernyataan kueri.

      SELECT
          l.shipmode,
          l.extendedprice * (1 - l.discount) AS disc_price
      FROM
          orders AS o,
          lineitem AS l
      WHERE o.orderkey = l.orderkey
          AND l.shipmode in ('REG AIR', 'TRUCK')
          AND l.commitdate < l.receiptdate
          AND l.shipdate < l.commitdate;
    • Buat tampilan materialized.

      CREATE MATERIALIZED VIEW mv1
      REFRESH NEXT now() + interval 1 day
      ENABLE QUERY REWRITE
      AS 
      SELECT
        l.shipmode,
        l.extendedprice,
        l.discount
      FROM
        orders AS o,
        lineitem AS l
      WHERE o.orderkey = l.orderkey
        AND l.commitdate < l.receiptdate
        AND l.shipdate < l.commitdate;
    • Jika Anda menjalankan pernyataan kueri setelah mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized, pernyataan kueri ditulis ulang sebagai berikut:

      SELECT
          shipmode,
          extendedprice * (1 - discount) AS disc_price,
          discount
      FROM mv1
      WHERE shipmode in ('REG AIR', 'TRUCK');
  • JOIN

    AnalyticDB for MySQL mendukung inner join, outer join, left join, dan right join untuk kueri dan tampilan materialized. Jika kueri dan tampilan materialized berisi hubungan join yang berbeda, AnalyticDB for MySQL mencoba menghitung hubungan join yang diperlukan untuk kueri berdasarkan tampilan materialized dengan menggunakan aturan JOIN. Sebagai contoh, AnalyticDB for MySQL memfilter satu baris data dalam tampilan materialized. Dengan cara ini, tampilan materialized yang berisi outer join dapat digunakan untuk menghitung kueri yang berisi hubungan inner join. Contoh:

    • Jalankan pernyataan kueri.

      SELECT
        p.type,
        p.partkey,
        ps.suppkey
      FROM
        part AS p,
        partsupp AS ps
      WHERE p.partkey = ps.partkey
        AND p.type NOT LIKE  'MEDIUM POLISHED%';
    • Buat tampilan materialized.

      CREATE MATERIALIZED VIEW mv2
      REFRESH NEXT now() + INTERVAL 1 day
      ENABLE QUERY REWRITE
      AS 
      SELECT 
        p.type,
        p.partkey,
        ps.suppkey
      FROM
        partsupp AS ps 
        INNER JOIN part AS p ON p.partkey = ps.partkey
      WHERE p.type NOT LIKE 'MEDIUM POLISHED%';
    • Jika Anda menjalankan pernyataan kueri setelah mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized, pernyataan kueri ditulis ulang sebagai berikut:

      SELECT type, partkey, suppkey
      FROM mv2;
  • AGGREGATION

    Jika kueri atau tampilan materialized menggunakan klausa GROUP BY atau fungsi agregat yang berbeda, AnalyticDB for MySQL membangun fungsi agregat yang sama dari tampilan materialized dengan menggunakan aturan AGGREGATION. Contoh:

    • Jalankan pernyataan kueri.

      SELECT
        l.returnflag,
        l.linestatus,
        SUM(l.extendedprice * (1 - l.discount)) AS sum_disc_price
      FROM lineitem AS l
      GROUP BY l.returnflag, l.linestatus;
    • Buat tampilan materialized.

      CREATE MATERIALIZED VIEW mv3
      REFRESH NEXT now() + INTERVAL 1 day
      ENABLE QUERY REWRITE
      AS
      SELECT
          l.returnflag,
          l.linestatus, 
          SUM(l.extendedprice * (1 - l.discount)) AS sum_disc_price, 
          COUNT(*) AS count_order
      FROM lineitem AS l 
      GROUP BY l.returnflag, l.linestatus;
    • Jika Anda menjalankan pernyataan kueri setelah mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized, pernyataan kueri ditulis ulang sebagai berikut:

      SELECT returnflag, linestatus, sum_disc_price, count_order
      FROM mv3;
  • AGGREGATION ROLLUP

    Jika kueri dan tampilan materialized menggunakan bidang GROUP BY yang berbeda, AnalyticDB for MySQL mencoba menggulung tampilan materialized dengan menggunakan aturan ROLLUP. Contoh:

    • Jalankan pernyataan kueri.

      SELECT
        l.returnflag,
        SUM(l.extendedprice * (1 - l.discount)) AS sum_disc_price,
        COUNT(*) AS count_order
      FROM lineitem AS l
      WHERE l.returnflag = 'R'
      GROUP BY  l.returnflag;
    • Buat tampilan materialized.

      CREATE MATERIALIZED VIEW mv4
      REFRESH NEXT now() + INTERVAL 1 day
      ENABLE QUERY REWRITE
      AS
      SELECT
          l.returnflag,
          l.linestatus, 
          SUM(l.extendedprice * (1 - l.discount)) AS sum_disc_price, 
          COUNT(*) AS count_order
      FROM lineitem AS l 
      GROUP BY l.returnflag, l.linestatus;
    • Jika Anda menjalankan pernyataan kueri setelah mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized, pernyataan kueri ditulis ulang sebagai berikut:

      SELECT 
        returnflag, 
        linestatus,
        sum_disc_price, 
        count_order
      FROM mv4
      WHERE returnflag = 'R'
      GROUP BY returnflag;
  • SUBQUERIES

    Jika kueri dan tampilan materialized memiliki subkueri yang berbeda, AnalyticDB for MySQL mencoba menulis ulang kueri dengan menggunakan aturan SUBQUERIES. Contoh:

    • Jalankan pernyataan kueri.

      SELECT
        p.type,
        p.partkey,
        ps.suppkey
      FROM
        part AS p,
        (SELECT * FROM partsupp WHERE suppkey > 10) ps
      WHERE p.partkey = ps.partkey;
    • Buat tampilan materialized.

      CREATE MATERIALIZED VIEW mv5
      REFRESH NEXT now() + INTERVAL 1 day
      ENABLE QUERY REWRITE
      AS 
      SELECT 
        p.type,
        p.partkey,
        ps.suppkey
      FROM
        part AS p,
        partsupp AS ps
      WHERE p.partkey = ps.partkey;
    • Jika Anda menjalankan pernyataan kueri setelah mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized, pernyataan kueri ditulis ulang sebagai berikut:

      SELECT 
        type,
        partkey,
        suppkey
      FROM mv5
      WHERE suppkey > 10;
  • QUERY PARTIAL

    Jika tabel yang terlibat dalam kueri tidak ada dalam tampilan materialized, AnalyticDB for MySQL mencoba menggabungkan tabel yang hilang ke tampilan materialized dengan menggunakan aturan QUERY PARTIAL. Contoh:

    • Jalankan pernyataan kueri.

      SELECT 
        p.type,
        p.partkey,
        ps.suppkey
      FROM
        part AS p,
        partsupp AS ps
      WHERE p.partkey = ps.partkey
          AND p.type NOT LIKE 'MEDIUM POLISHED%';
    • Buat tampilan materialized.

      CREATE MATERIALIZED VIEW mv6
      REFRESH NEXT now() + INTERVAL 1 day
      ENABLE QUERY REWRITE
      AS
      SELECT
        p.type,
        p.partkey
      FROM
        part AS p
      WHERE p.type NOT LIKE  'MEDIUM POLISHED%';
    • Jika Anda menjalankan pernyataan kueri setelah mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized, pernyataan kueri ditulis ulang sebagai berikut:

      SELECT
        mv6.type,
        mv6.partkey,
        ps.suppkey
      FROM 
        mv6,
        partsupp AS ps
      WHERE mv6.partkey = ps.partkey;
  • UNION

    Jika tampilan materialized hanya berisi data spesifik yang diperlukan untuk kueri, AnalyticDB for MySQL memperoleh hasil kueri spesifik dari data yang ada pada tampilan materialized dan hasil kueri sisanya dari tabel dasar dengan menggunakan aturan UNION.

    • Jalankan pernyataan kueri.

      SELECT
        l.linestatus,
        COUNT(*) AS count_order
      FROM lineitem AS l
      WHERE l.shipdate >= DATE '1998-01-01'
      GROUP BY l.linestatus;
    • Buat tampilan materialized.

      CREATE MATERIALIZED VIEW mv7
      REFRESH NEXT now() + interval 1 day
      ENABLE QUERY REWRITE
      AS
      SELECT
        l.linestatus,
        COUNT(*) AS count_order
      FROM lineitem AS l 
      WHERE l.shipdate >= DATE '2000-01-01'
      GROUP BY l.linestatus;
    • Jika Anda menjalankan pernyataan kueri setelah mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized, pernyataan kueri ditulis ulang sebagai berikut:

      SELECT 
        linestatus,
        count_order
      FROM (
          SELECT linestatus, count_order
        FROM mv7
      UNION ALL
          SELECT 
            l.linestatus,
            COUNT(*) AS count_order
          FROM lineitem AS l 
          WHERE l.shipdate >= DATE '1998-01-01' AND l.shipdate < DATE '1998-01-01'
          GROUP BY l.linestatus) 
      GROUP BY linestatus;

Pertanyaan Umum

T: Mengapa fitur penulisan ulang kueri gagal berfungsi setelah saya membuat tampilan materialized?

A: Jika fitur penulisan ulang kueri tidak berfungsi, lakukan operasi berikut:

  • Periksa apakah Anda telah mengaktifkan fitur penulisan ulang kueri untuk tampilan materialized. Untuk informasi lebih lanjut, lihat bagian "Gunakan Fitur Penulisan Ulang Kueri".

  • Periksa apakah tampilan materialized memiliki batasan. Untuk informasi lebih lanjut, lihat bagian "Batasan".

  • Periksa apakah Anda memiliki izin SELECT pada tampilan materialized. Anda dapat menjalankan pernyataan GRANT untuk memberikan izin yang diperlukan kepada akun database yang ingin Anda gunakan untuk melakukan kueri. Untuk informasi lebih lanjut, lihat bagian "Izin yang Diperlukan".