Petunjuk paralel memungkinkan Anda menentukan apakah akan mengaktifkan fitur kueri paralel. Anda juga dapat menentukan derajat paralelisme (DOP), tabel yang perlu dipindai secara paralel, dan mode eksekusi paralel setiap operator. PolarDB untuk MySQL 8.0.1 mendukung petunjuk PARALLEL dan NO_PARALLEL dalam fitur kueri paralel. PolarDB untuk MySQL 8.0.2 mendukung petunjuk berikut: PARALLEL, NO_PARALLEL, PQ_DISTRIBUTE, PQ_GROUPBY, PQ_DISTINCT, PQ_WINDOW, dan PQ_ORDERBY. Petunjuk PQ_DISTRIBUTE digunakan untuk menentukan kebijakan eksekusi paralel operasi gabungan. Petunjuk PQ_GROUPBY, PQ_DISTINCT, PQ_WINDOW, dan PQ_ORDERBY digunakan untuk menentukan mode eksekusi paralel setiap operator analitik.
Aktifkan atau nonaktifkan fitur kueri paralel
Aktifkan Fitur Kueri Paralel
Anda dapat menjalankan salah satu pernyataan berikut untuk mengaktifkan fitur kueri paralel:
SELECT /*+PARALLEL(x)*/ ... FROM ...; -- x >0SELECT /*+ SET_VAR(max_parallel_degree=n) */ * FROM ... -- n > 0
Nonaktifkan Fitur Kueri Paralel
Anda dapat menjalankan salah satu pernyataan berikut untuk menonaktifkan fitur kueri paralel:
SELECT /*+NO_PARALLEL()*/ ... FROM ...;SELECT /*+ SET_VAR(max_parallel_degree=0) */ * FROM ...
Gunakan petunjuk untuk menentukan tabel yang perlu dipindai secara paralel
Fitur kueri paralel mendukung petunjuk PARALLEL dan NO_PARALLEL. Petunjuk ini menentukan tabel yang perlu dipindai secara paralel dan yang tidak perlu dipindai secara paralel.
Anda dapat menggunakan petunjuk
PARALLELuntuk menerapkan kueri paralel dan menentukan DOP serta tabel yang perlu dipindai secara paralel. Contoh sintaksis:/*+ PARALLEL [( [query_block] [table_name] [degree] )] */Anda dapat menggunakan petunjuk
NO_PARALLELuntuk menerapkan kueri sekuensial atau menentukan tabel yang dilarang pemindaian paralelnya./*+ NO_PARALLEL [( [query_block] [table_name][, table_name] )] */
Tabel berikut menjelaskan parameter yang dapat Anda konfigurasikan.
Parameter | Deskripsi |
query_block | Nama blok kueri tempat petunjuk diterapkan. |
table_name | Nama tabel tempat petunjuk diterapkan. |
degree | DOP. |
Contoh:
SELECT /*+PARALLEL()*/ * FROM t1, t2;
-- Saat jumlah baris dalam tabel kurang dari nilai tertentu dari records_threshold_for_parallelism, kueri paralel dipaksa dijalankan. Nilai default records_threshold_for_parallelism adalah 10000.
-- Parameter default max_parallel_degree digunakan untuk menentukan DOP. Jika max_parallel_degree disetel ke nilai lebih besar dari 0,
-- Fitur kueri paralel diaktifkan. Jika max_parallel_degree disetel ke 0, fitur kueri paralel dinonaktifkan.
SELECT /*+PARALLEL(8)*/ * FROM t1, t2;
-- Pernyataan ini menerapkan kueri paralel dengan DOP 8.
-- Saat jumlah baris dalam tabel kurang dari nilai tertentu dari records_threshold_for_parallelism, kueri paralel dipaksa dijalankan. Nilai default records_threshold_for_parallelism adalah 10000.
-- Parameter max_parallel_degree disetel ke 8.
SELECT /*+ SET_VAR(max_parallel_degree=8) */ * FROM ...
-- Parameter max_parallel_degree disetel ke 8.
-- Saat jumlah baris dalam tabel kurang dari nilai records_threshold_for_parallelism, seperti 20000, fitur kueri paralel otomatis dinonaktifkan.
SELECT /*+PARALLEL(t1)*/ * FROM t1, t2;
-- Pernyataan ini menerapkan kueri paralel pada tabel t1 menggunakan sintaksis /*+PARALLEL()*/ untuk tabel.
SELECT /*+PARALLEL(t1 8)*/ * FROM t1, t2;
-- Pernyataan ini menerapkan kueri paralel pada tabel t1 dengan DOP 8 menggunakan sintaksis /*+PARALLEL(8)*/ untuk tabel.
SELECT /*+PARALLEL(@subq1)*/ SUM(t.a) FROM t WHERE t.a =
(SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);
-- Pernyataan ini menerapkan subkueri paralel. Parameter default max_parallel_degree digunakan untuk menentukan DOP.
-- Jika max_parallel_degree disetel ke nilai lebih besar dari 0, fitur kueri paralel diaktifkan. Jika max_parallel_degree disetel ke 0, fitur kueri paralel dinonaktifkan.
SELECT /*+PARALLEL(@subq1 8)*/ SUM(t.a) FROM t WHERE t.a =
(SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);
-- Pernyataan ini menerapkan subkueri paralel. Parameter max_parallel_degree disetel ke 8.
SELECT SUM(t.a) FROM t WHERE t.a =
(SELECT /*+PARALLEL()*/ SUM(t1.a) FROM t1);
-- Pernyataan ini menerapkan subkueri paralel.
-- Parameter default max_parallel_degree digunakan untuk menentukan DOP.
-- Jika max_parallel_degree disetel ke nilai lebih besar dari 0, fitur kueri paralel diaktifkan. Jika max_parallel_degree disetel ke 0, fitur kueri paralel dinonaktifkan.
SELECT SUM(t.a) FROM t WHERE t.a =
(SELECT /*+PARALLEL(8)*/ SUM(t1.a) FROM t1);
-- Pernyataan ini menerapkan subkueri paralel. Parameter max_parallel_degree disetel ke 8.
SELECT /*+NO_PARALLEL()*/ * FROM t1, t2;
-- Pernyataan ini menonaktifkan fitur kueri paralel.
SELECT /*+NO_PARALLEL(t1)*/ * FROM t1, t2;
-- Pernyataan ini melarang kueri paralel hanya untuk tabel t1. Jika sistem mengaktifkan fitur kueri paralel, sistem mungkin melakukan pemindaian paralel dan menjalankan kueri paralel pada tabel t2.
SELECT /*+NO_PARALLEL(t1, t2)*/ * FROM t1, t2;
-- Pernyataan ini melarang kueri paralel untuk tabel t1 dan t2.
SELECT /*+NO_PARALLEL(@subq1)*/ SUM(t.a) FROM t WHERE t.a =
(SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);
-- Pernyataan ini melarang subkueri paralel.
SELECT SUM(t.a) FROM t WHERE t.a =
(SELECT /*+NO_PARALLEL()*/ SUM(t1.a) FROM t1);
-- Pernyataan ini melarang subkueri paralel.Petunjuk PARALLEL tidak efektif untuk kueri yang tidak mendukung pemrosesan paralel atau tabel yang tidak mendukung pemindaian paralel.
Operasi penggabungan paralel
Anda dapat menggunakan petunjuk PQ_DISTRIBUTE untuk menentukan mode eksekusi kueri paralel operasi penggabungan.
Gunakan petunjuk
PQ_DISTRIBUTEuntuk menentukan strategi distribusi data tabel:/*+ PQ_DISTRIBUTE([query_block] table_name strategy ) */Tabel berikut menjelaskan parameter yang dapat Anda konfigurasikan.
Parameter
Deskripsi
query_block
Nama blok kueri tempat petunjuk diterapkan.
table_name
Nama tabel tempat petunjuk diterapkan.
strategy
Strategi distribusi data. Nilai valid:
PQ_GATHER: Data dikumpulkan ke pekerja fase sebelumnya.
PQ_HASH: Data diacak dan didistribusikan ke beberapa pekerja fase sebelumnya.
PQ_BROADCAST: Data disiarkan ke beberapa pekerja fase sebelumnya.
PQ_NONE: Data tidak didistribusikan.
Contoh:
SELECT /*+ PARALLEL(t1) PQ_DISTRIBUTE(t1 PQ_GATHER) */ * FROM t as t1; -- Saat jumlah baris dalam tabel kurang dari nilai tertentu dari records_threshold_for_parallelism, kueri paralel dipaksa dijalankan. Nilai default records_threshold_for_parallelism adalah 10000. -- Parameter default max_parallel_degree digunakan untuk menentukan DOP. Jika max_parallel_degree disetel ke nilai lebih besar dari 0, -- Fitur kueri paralel diaktifkan. Jika max_parallel_degree disetel ke 0, fitur kueri paralel dinonaktifkan. -- Setelah tabel dipindai secara paralel, data tidak didistribusikan, tetapi hasilnya dikumpulkan oleh pemimpin. SELECT /*+ PARALLEL(t1) PQ_DISTRIBUTE(t1 PQ_HASH) */t1.a, SUM(t1.b) * FROM t as t1 GROUP BY t1.a; -- Setelah tabel dipindai secara paralel, data didistribusikan ke pekerja fase berikutnya berdasarkan kunci grup.Gunakan petunjuk
PQ_DISTRIBUTEuntuk menentukan mode penggabungan dua tabel:/*+ PQ_DISTRIBUTE([query_block] table_name strategy1 [strategy2]) */Dalam pernyataan sebelumnya, jika hanya
strategy1yang ditentukan, itu menunjukkan bahwa metode distribusi data tabel table_name ditentukan. Jika baikstrategy1maupunstrategy2ditentukan, itu menunjukkan bahwa mode penggabungan paralel antara tabeltable_namedan tabel sebelumnya ditentukan.CatatanTabel sebelumnya bisa berupa tabel fisik atau tabel antara dalam operasi penggabungan sebelumnya.
Contoh:
SELECT /*+ PARALLEL(t1) PARALLEL(t2) PQ_DISTRIBUTE(t2 PQ_HASH PQ_HASH) */ * FROM t as t1 STRAIGHT_JOIN t as t2 on t1.b = t2.c; -- Tabel t1 dipindai secara paralel, dan data diacak dan didistribusikan ke pekerja fase berikutnya. -- Tabel t2 dipindai secara paralel, dan data diacak dan didistribusikan ke pekerja fase berikutnya. -- Pekerja fase berikutnya menjalankan penggabungan co-location. Kemudian, hasilnya dikumpulkan oleh pemimpin. SELECT /*+ PARALLEL(t1) PARALLEL(t2) PQ_DISTRIBUTE(t2 PQ_GATHER PQ_GATHER) */ * FROM t as t1 STRAIGHT_JOIN t as t2 on t1.b = t2.c; -- Tabel t1 dipindai secara paralel, dan data didistribusikan ke pemimpin. -- Tabel t2 dipindai secara paralel, dan data didistribusikan ke pemimpin. -- Pemimpin mengumpulkan data dan menyelesaikan operasi penggabungan.Jika kueri tidak mendukung pemrosesan paralel atau kueri menggunakan dua petunjuk yang bertentangan, kueri mungkin gagal. Contoh sintaksis:
SELECT /*+ PARALLEL(t1) PARALLEL(t2) PQ_DISTRIBUTE(t2 PQ_HASH PQ_GATHER) */ * FROM t as t1 STRAIGHT_JOIN t as t2 on t1.b = t2.c; -- Tabel t1 dipindai secara paralel, dan data didistribusikan ke beberapa pekerja fase berikutnya. -- Tabel t2 dipindai secara paralel, dan data didistribusikan ke pemimpin. -- Mode distribusi data dari dua petunjuk tersebut bertentangan satu sama lain, sehingga rencana kueri paralel tidak dapat dibuat.
Pengelompokan agregasi paralel: PQ_GROUPBY
Anda dapat menggunakan petunjuk PQ_GROUPBY untuk menentukan mode eksekusi agregasi berkelompok.
/*+ PQ_GROUPBY(strategy) */Tabel berikut menjelaskan parameter yang dapat Anda konfigurasikan.
Parameter | Deskripsi |
strategy | Strategi distribusi data. Nilai valid:
|
Contoh:
SELECT /*+ PARALLEL(t1) PQ_GROUPBY(PQ_ONEPHASE) */ t1.a, sum(t1.b) FROM t as t1 GROUP BY t1.a;
-- Tabel t1 dipindai secara paralel dan data didistribusikan ke beberapa pekerja fase berikutnya berdasarkan kolom t1.a.
-- Beberapa pekerja fase berikutnya menyelesaikan perhitungan agregasi. Kemudian, hasilnya dikumpulkan oleh pemimpin.
SELECT /*+ PARALLEL(t1) PQ_GROUPBY(PQ_TWOPHASE_HASH) */ t1.a, sum(t1.b) FROM t as t1 GROUP BY t1.a;
-- Pekerja memindai tabel t1 secara paralel dan melakukan agregasi data secara terpisah.
-- Hasil agregasi perantara didistribusikan ke beberapa pekerja fase berikutnya berdasarkan kolom t1.a.
-- Beberapa pekerja fase berikutnya menyelesaikan perhitungan agregasi. Kemudian, hasilnya dikumpulkan oleh pemimpin.Pengelompokan agregasi paralel: PQ_DISTINCT
Anda dapat menggunakan petunjuk PQ_DISTINCT untuk menentukan mode eksekusi agregasi berkelompok.
/*+ PQ_DISTINCT(strategy) */Tabel berikut menjelaskan parameter yang dapat Anda konfigurasikan.
Parameter | Deskripsi |
strategy | Strategi distribusi data. Nilai valid:
|
Fungsi jendela paralel
Anda dapat menggunakan petunjuk PQ_WINDOW untuk menentukan mode eksekusi fungsi jendela.
/*+ PQ_WINDOW([window_name] strategy) */Petunjuk dengan nama jendela yang ditentukan memiliki prioritas lebih tinggi daripada petunjuk tanpa nama jendela.
Tabel berikut menjelaskan parameter yang dapat Anda konfigurasikan.
Parameter | Deskripsi |
window_name | Nama fungsi jendela tempat strategi distribusi data diterapkan. Jika Anda tidak menentukan parameter ini, strategi distribusi data diterapkan ke semua fungsi jendela. |
strategy | Strategi distribusi data. Nilai valid:
|
Contoh:
SELECT /*+ PQ_WINDOW(PQ_ONEPHASE) PQ_WINDOW(win PQ_SERIAL) */
ROW_NUMBER() OVER(win) AS 'row_number',
RANK() over(partition by name order by salary desc)
FROM employee_salaries WINDOW win as (partition by dept order by salary desc);
-- Fungsi jendela bernama win dipanggil untuk menjalankan komputasi secara serial.
-- Untuk fungsi jendela lainnya, data didistribusikan ke beberapa pekerja berdasarkan kunci yang ditentukan dalam klausa PARTITION BY untuk komputasi paralel.Pengurutan data paralel
Anda dapat menggunakan petunjuk PQ_ORDERBY untuk menentukan mode pengurutan data.
/*+ PQ_ORDERBY(strategy) */Tabel berikut menjelaskan parameter yang dapat Anda konfigurasikan.
Parameter | Deskripsi |
strategy | Strategi distribusi data. Nilai valid:
|
Subkueri paralel
Anda dapat menggunakan petunjuk untuk menentukan kebijakan menjalankan subkueri paralel. Untuk informasi lebih lanjut, lihat dukungan untuk subkueri dalam Lihat Rencana Eksekusi Kueri Paralel. Contoh sintaksis:
/*+ PQ_PUSHDOWN [( [query_block])] */ # Subkueri dijalankan secara paralel berdasarkan kebijakan pushdown.
/*+ NO_PQ_PUSHDOWN [( [query_block])] */ # Subkueri dijalankan secara paralel berdasarkan kebijakan akses bersama. Contoh:
# Subkueri dijalankan secara paralel berdasarkan kebijakan pushdown.
EXPLAIN SELECT /*+ PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =
(SELECT /*+ qb_name(qb1) */ a FROM t1);
# Subkueri dijalankan secara paralel berdasarkan kebijakan akses bersama.
EXPLAIN SELECT /*+ NO_PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =
(SELECT /*+ qb_name(qb1) */ a FROM t1);
# Tidak ada petunjuk yang ditambahkan ke blok kueri.
EXPLAIN SELECT * FROM t2 WHERE t2.a =
(SELECT /*+ NO_PQ_PUSHDOWN() */ a FROM t1);