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.
CatatanUntuk melihat dan memperbarui versi minor dari kluster AnalyticDB for MySQL, masuk ke Konsol AnalyticDB for MySQL dan pergi ke bagian Configuration Information pada halaman Cluster Information.
Untuk melihat dan memperbarui versi minor dari kluster AnalyticDB for MySQL, masuk ke Konsol AnalyticDB for MySQL dan pergi ke bagian Configuration Information pada halaman Cluster Information.
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
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;Jalankan kueri.
SELECT course_id,course_name,max(course_grade) AS max_grade FROM tb_courses;Jalankan pernyataan
EXPLAINuntuk 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 tabeltb_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, danRANDOM.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, danRANDOM.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
GRANTuntuk memberikan izin yang diperlukan kepada akun database yang ingin Anda gunakan untuk melakukan kueri. Untuk informasi lebih lanjut, lihat bagian "Izin yang Diperlukan".