PolarDB for PostgreSQL (Kompatibel dengan Oracle) memungkinkan Anda menggunakan fitur Elastic Parallel Query untuk menjalankan kueri analitik, sehingga mendukung kemampuan pemrosesan transaksi/analitik hibrida (HTAP). Topik ini menjelaskan cara menggunakan fitur tersebut untuk meningkatkan performa kueri analitik.
Cara kerja fitur Elastic Parallel Query
Dalam Elastic Parallel Query, sebuah kueri dijalankan secara paralel pada beberapa node. Node yang mengoordinasikan eksekusi disebut node koordinator kueri (QC), sedangkan node lainnya disebut node eksekusi paralel (PX). Setelah permintaan kueri dimulai, node QC membagi rencana eksekusi menjadi beberapa bagian (shard) dan merutekannya ke node PX. Setiap node PX menjalankan bagian rencana yang ditugaskan dan mengirimkan hasilnya ke node QC, yang kemudian menggabungkan hasil tersebut.

Pada gambar sebelumnya, RO1 adalah node QC, sedangkan RO2, RO3, dan RO4 adalah node PX. Setelah RO1 menerima permintaan kueri, RO1 membagi rencana eksekusi menjadi tiga shard dan merutekannya ke RO2, RO3, dan RO4. Setiap node PX menjalankan bagian rencana yang ditugaskan, mengambil blok data dari sistem penyimpanan bersama Polar File System (PolarFS), lalu mengirimkan hasilnya ke node QC. Node QC kemudian menggabungkan hasil tersebut dan mengembalikan hasil akhir.
Peringatan
Karena beberapa node baca-saja diperlukan untuk menjalankan setiap kueri secara paralel, Elastic Parallel Query hanya cocok untuk kueri analitik yang jarang dijalankan.
Gunakan fitur Elastic Parallel Query untuk melakukan kueri analitik pada tingkat yang berbeda
Anda dapat menggunakan fitur Elastic Parallel Query untuk melakukan kueri analitik pada tiga tingkat granularitas berikut:
Tingkat Sistem: Konfigurasikan parameter terkait untuk menentukan apakah akan mengaktifkan atau menonaktifkan fitur Elastic Parallel Query untuk semua kueri dan sesi.
Tingkat Sesi: Jalankan pernyataan ALTER SESSION atau konfigurasikan parameter GUC tingkat sesi untuk menentukan apakah akan mengaktifkan atau menonaktifkan fitur Elastic Parallel Query untuk sesi saat ini.
Tingkat Kueri: Gunakan petunjuk (hint) untuk menentukan apakah fitur Elastic Parallel Query diaktifkan atau dinonaktifkan untuk kueri tertentu.
Parameter
Secara default, fitur Elastic Parallel Query dinonaktifkan dalam PolarDB for PostgreSQL (Kompatibel dengan Oracle). Untuk menggunakan fitur ini, konfigurasikan parameter yang dijelaskan dalam tabel berikut.
Parameter | Parameter |
polar_cluster_map | Mengambil nama semua node baca-saja dalam PolarDB for PostgreSQL (Kompatibel dengan Oracle). Anda tidak dapat mengonfigurasi parameter ini. Setiap kali Anda menambahkan node baca-saja, daftar nama node yang dikembalikan untuk parameter ini diperbarui secara otomatis. Catatan Parameter ini hanya tersedia untuk kluster yang menggunakan versi kernel minor 1.1.20 (dirilis pada Januari 2022) atau lebih lama. |
polar_px_nodes | Menentukan node baca-saja di mana kueri Anda dijalankan pada beberapa node. Parameter ini kosong secara default, yang menunjukkan bahwa semua node baca-saja digunakan untuk eksekusi paralel. Jika Anda ingin menggunakan node tertentu untuk eksekusi paralel, atur parameter ini ke nama node yang ingin Anda gunakan. Gunakan koma (,) untuk memisahkan nama node. Contoh: |
polar_px_enable_replay_wait | Menentukan apakah akan mengaktifkan konsistensi kuat. Nilai valid: on dan off. Ada jeda antara node utama dan node baca-saja dalam kluster PolarDB for PostgreSQL (Kompatibel dengan Oracle) Anda. Sebagai contoh, setelah node utama mengeksekusi pernyataan CREATE TABLE, pernyataan DDL ini diputar ulang pada node baca-saja agar node baca-saja disinkronkan dengan node utama. Pemutaran ulang ini menyebabkan jeda. Jika Anda mengatur parameter Nilai default adalah off, yang menunjukkan bahwa konsistensi kuat dinonaktifkan. Jika Anda mengatur parameter ke off, ada jeda panjang antara node utama dan node baca-saja karena pemutaran ulang log dan node baca-saja mungkin gagal membaca catatan log terbaru operasi DDL. Jika Anda mengatur parameter Anda juga dapat mengatur parameter ini ke on untuk peran basis data tertentu. |
polar_px_max_workers_number | Menentukan jumlah maksimum proses pekerja yang dapat dijalankan pada node untuk Elastic Parallel Query. Nilai default adalah 30. Parameter ini digunakan untuk membatasi derajat paralelisme pada setiap node. Jumlah proses pekerja untuk setiap node dalam semua sesi untuk Elastic Parallel Query tidak boleh melebihi nilai parameter ini. |
polar_enable_px | Menentukan apakah akan mengaktifkan fitur Elastic Parallel Query. Nilai default adalah off, yang menunjukkan bahwa fitur dinonaktifkan. |
polar_px_dop_per_node | Menentukan derajat paralelisme untuk Elastic Parallel Query pada sesi saat ini. Nilai default adalah 1. Kami merekomendasikan Anda mengatur nilai ini ke jumlah core dalam sistem operasi Anda. Jika Anda mengatur polar_px_dop_per_node ke N, setiap node menggunakan N proses pekerja px untuk sesi untuk menjalankan kueri Anda secara paralel. |
px_workers | Menentukan apakah fitur diterapkan pada tabel tertentu. Secara default, fitur tidak diterapkan pada tabel apa pun. Fitur ini sangat mengonsumsi sumber daya komputasi. Untuk mengurangi sumber daya komputasi yang dikonsumsi, Anda dapat mengonfigurasi parameter ini untuk menentukan tabel tempat fitur diterapkan. Kode berikut memberikan contoh untuk menjelaskan cara mengonfigurasi parameter ini: |
synchronous_commit | Menentukan apakah transaksi perlu menunggu log WAL ditulis ke disk sebelum mengembalikan pesan sukses ke klien ketika database melakukan commit transaksi. Nilai default: on. Nilai valid:
Catatan Parameter ini diatur ke on dalam mode PX. |
Contoh
Berikut ini menjelaskan efek dari fitur Elastic Parallel Query. Dalam contoh ini, kueri dilakukan pada tabel tunggal.
Informasi Latar Belakang
Jalankan pernyataan berikut untuk membuat tabel bernama test dan menyisipkan data ke dalam tabel:
CREATE TABLE test(id int);
INSERT INTO test SELECT generate_series(1,1000000);
EXPLAIN SELECT * FROM test;Secara default, fitur Elastic Parallel Query dinonaktifkan. Rencana eksekusi asli untuk kueri tabel tunggal adalah melakukan pemindaian berurutan (Seq Scan), seperti yang ditunjukkan dalam kode berikut:
QUERY PLAN
--------------------------------------------------------
Seq Scan on test (cost=0.00..35.50 rows=2550 width=4)
(1 row)Untuk mengaktifkan fitur Elastic Parallel Query, ikuti langkah-langkah berikut:
Aktifkan fitur ini untuk tabel bernama test:
ALTER TABLE test SET (px_workers=1); SET polar_enable_px=on; EXPLAIN SELECT * FROM test;Hasil kueri berikut dikembalikan:
QUERY PLAN ------------------------------------------------------------------------------- PX Coordinator 2:1 (slice1; segments: 2) (cost=0.00..431.00 rows=1 width=4) -> Seq Scan on test (scan partial) (cost=0.00..431.00 rows=1 width=4) Optimizer: PolarDB PX Optimizer (3 rows)Kueri nama semua node baca-saja.
Jalankan pernyataan berikut:
SHOW polar_cluster_map;Hasil kueri berikut dikembalikan:
polar_cluster_map ------------------- node1,node2,node3 (1 row)Dalam contoh ini, kluster memiliki tiga node baca-saja: node1, node2, dan node3.
Tentukan node1 dan node2 untuk Elastic Parallel Query.
Jalankan pernyataan berikut:
SET polar_px_nodes='node1,node2';Kueri node yang ditentukan untuk Elastic Parallel Query:
SHOW polar_px_nodes ;Hasil kueri berikut dikembalikan:
polar_px_nodes ---------------- node1,node2 (1 row)
Data performa
Data performa berikut diperoleh dari tes di mana lima node baca-saja digunakan untuk eksekusi paralel.
Ketika
SELECT COUNT(*)dieksekusi untuk pemindaian tabel penuh, Elastic Parallel Query 60 kali lebih cepat daripada eksekusi paralel satu node.Dalam kueri TPC-H, Elastic Parallel Query 30 kali lebih cepat daripada eksekusi paralel satu node.
Catatan Dalam contoh ini, tes berdasarkan benchmark TPC-H diimplementasikan, tetapi tidak memenuhi semua persyaratan tes benchmark TPC-H. Oleh karena itu, hasil tes mungkin tidak dapat dibandingkan dengan hasil yang diterbitkan dari tes benchmark TPC-H.
Tentukan tingkat untuk Elastic Parallel Query
Berikut ini menjelaskan cara menggunakan fitur Elastic Parallel Query untuk melakukan kueri analitik pada tingkat granularitas yang berbeda:
System level
Jika Anda ingin menggunakan fitur Elastic Parallel Query pada tingkat sistem, konfigurasikan parameter Grand Unified Configuration (GUC) global untuk mengaktifkan fitur dan menentukan derajat paralelisme.
Examples
postgres=# alter system set polar_enable_px=1; ALTER SYSTEM postgres=# alter system set polar_px_dop_per_node=1; ALTER SYSTEM postgres=# select pg_reload_conf(); pg_reload_conf ---------------- t (1 row) postgres=# \c postgres Anda sekarang terhubung ke basis data "postgres" sebagai pengguna "postgres". postgres=# drop table if exists t1; DROP TABLE postgres=# select id into t1 from generate_series(1, 1000) as id order by id desc; SELECT 1000 postgres=# alter table t1 set (px_workers=1); ALTER TABLE postgres=# explain (verbose, costs off) select * from t1 where id < 10; QUERY PLAN ------------------------------------------- PX Coordinator 2:1 (slice1; segments: 2) Output: id -> Partial Seq Scan on public.t1 Output: id Filter: (t1.id < 10) Optimizer: PolarDB PX Optimizer (6 rows)Session level
Jika Anda ingin menggunakan fitur Elastic Parallel Query pada tingkat sesi, jalankan pernyataan ALTER SESSION atau konfigurasikan parameter GUC tingkat sesi.
ALTER SESSION syntax
ALTER SESSION ENABLE PARALLEL QUERY ALTER SESSION DISABLE PARALLEL QUERY ALTER SESSION FORCE PARALLEL QUERY [PARALLEL integer]CatatanALTER SESSION ENABLE PARALLEL QUERYmenentukan bahwa Anda dapat menggunakan petunjuk atau sintaks yang sesuai untuk mengaktifkan Elastic Parallel Query untuk sesi saat ini.ALTER SESSION DISABLE PARALLEL QUERYmenentukan bahwa sesi saat ini tidak mendukung Elastic Parallel Query bahkan jika petunjuk atau sintaks yang sesuai ditentukan.ALTER SESSION FORCE PARALLEL QUERY <PARALLEL integer>menentukan bahwa fitur Elastic Parallel Query diaktifkan secara paksa untuk sesi saat ini. <PARALLEL integer> menentukan derajat paralelisme. Jika Anda tidak menentukan <PARALLEL integer>, nilai default basis data Anda digunakan sebagai derajat paralelisme. Nilai default adalah nilai yang ditentukan oleh parameter polar_px_dop_per_node.Anda dapat menggunakan metode yang berbeda untuk menentukan derajat paralelisme. Derajat paralelisme memiliki prioritas yang berbeda berdasarkan metode. Derajat paralelisme yang ditentukan dalam petunjuk memiliki prioritas tertinggi, derajat paralelisme yang ditentukan dalam pernyataan FORCE PARALLEL memiliki prioritas sedang, dan derajat paralelisme yang ditentukan oleh parameter polar_px_dop_per_node memiliki prioritas terendah.
Jika Anda menjalankan pernyataan ALTER SESSION, konfigurasi Elastic Parallel Query untuk sesi saat ini dimodifikasi. Setelah sesi saat ini tersambung kembali, Elastic Parallel Query diaktifkan secara default untuk sesi tersebut.
Example
--aktifkan postgres=# set polar_enable_px = false; SET postgres=# set polar_px_enable_hint = true; SET postgres=# alter session enable parallel query; ALTER SESSION postgres=# explain (verbose, costs off) select /*+ PARALLEL(4)*/ * from t1 where id < 10; INFO: [HINTS] PX PARALLEL(4) accepted. QUERY PLAN ------------------------------------------- PX Coordinator 8:1 (slice1; segments: 8) Output: id -> Partial Seq Scan on public.t1 Output: id Filter: (t1.id < 10) Optimizer: PolarDB PX Optimizer (6 rows)--nonaktifkan postgres=# set polar_enable_px = false; SET postgres=# set polar_px_enable_hint = true; SET postgres=# alter session disable parallel query; ALTER SESSION postgres=# explain (verbose, costs off) select /*+ PARALLEL(4)*/ * from t1 where id < 10; QUERY PLAN ------------------------ Seq Scan on public.t1 Output: id Filter: (t1.id < 10) (3 rows)--paksa postgres=# set polar_enable_px = false; SET postgres=# set polar_px_enable_hint = false; SET postgres=# alter session force parallel query; ALTER SESSION postgres=# explain (verbose, costs off) select * from t1 where id < 10; QUERY PLAN ------------------------------------------- PX Coordinator 2:1 (slice1; segments: 2) Output: id -> Partial Seq Scan on public.t1 Output: id Filter: (t1.id < 10) Optimizer: PolarDB PX Optimizer (6 rows) postgres=# alter session force parallel query parallel 2; ALTER SESSION postgres=# explain (verbose, costs off) select * from t1 where id < 10; QUERY PLAN ------------------------------------------- PX Coordinator 4:1 (slice1; segments: 4) Output: id -> Partial Seq Scan on public.t1 Output: id Filter: (t1.id < 10) Optimizer: PolarDB PX Optimizer (6 rows)Configure GUC parameters
Parameter GUC dapat dikonfigurasi pada tingkat sistem atau sesi. Anda dapat mengonfigurasi parameter GUC untuk menentukan apakah akan mengaktifkan atau menonaktifkan fitur Elastic Parallel Query untuk sesi saat ini.
Example
postgres=# set polar_enable_px = true; SET postgres=# set polar_px_dop_per_node = 1; SET postgres=# explain (verbose, costs off) select * from t1 where id < 10; QUERY PLAN ------------------------------------------- PX Coordinator 2:1 (slice1; segments: 2) Output: id -> Partial Seq Scan on public.t1 Output: id Filter: (t1.id < 10) Optimizer: PolarDB PX Optimizer (6 rows)
Query level
Jika Anda ingin menggunakan fitur Elastic Parallel Query pada tingkat kueri, gunakan petunjuk SQL untuk mengaktifkan fitur dan menentukan derajat paralelisme. Gunakan sintaks petunjuk berikut:
/*+ PARALLEL(DEFAULT) */ /*+ PARALLEL(integer) */ /*+ NO_PARALLEL(tablename) */CatatanPARALLEL(DEFAULT)menentukan bahwa Elastic Parallel Query diaktifkan dan derajat paralelisme default digunakan. Derajat paralelisme default ditentukan oleh parameter polar_px_dop_per_node.PARALLEL(integer)menentukan bahwa fitur Elastic Parallel Query diaktifkan dan derajat paralelisme yang ditentukan oleh parameter integer digunakan.NO_PARALLEL(tablename)menentukan bahwa Elastic Parallel Query dinonaktifkan untuk tabel tertentu. Untuk kueri yang melibatkan tabel ini, Elastic Parallel Query dinonaktifkan.Petunjuk ini kompatibel dengan petunjuk yang disediakan oleh Oracle. Jika lebih dari satu petunjuk PARALLEL digunakan, perhatikan item berikut:
Jika beberapa blok petunjuk seperti /*+.A.*/ /*+.B.*/ /*+.C.*/ digunakan bersama-sama, hanya blok petunjuk pertama yang berlaku.
Jika beberapa petunjuk PARALLEL ada dalam satu blok petunjuk, seperti /*+ parallel(A) parallel(B)*/, hasil eksekusi bervariasi berdasarkan derajat paralelisme yang ditentukan dalam petunjuk tersebut. Jika derajat paralelisme yang ditentukan dalam petunjuk tersebut sama, salah satu petunjuk berlaku. Jika tidak, tidak ada petunjuk yang berlaku.
Jika petunjuk PARALLEL dan petunjuk NO_PARALLEL ada dalam blok petunjuk yang sama, seperti /*+ parallel(A) no_parallel(t1)*/, petunjuk NO_PARALLEL tidak berlaku.
Elastic Parallel Query hanya mendukung petunjuk PARALLEL dan NO_PARALLEL.
Konfigurasikan parameter GUC polar_px_enable_hint untuk mengaktifkan atau menonaktifkan Elastic Parallel Query. Nilai default dari parameter ini adalah false.
Example
postgres=# set polar_enable_px = false; SET postgres=# set polar_px_dop_per_node = 1; SET postgres=# set polar_px_enable_hint = true; SET postgres=# explain (verbose, costs off) select * from t1 where id < 10; QUERY PLAN ------------------------ Seq Scan on public.t1 Output: id Filter: (t1.id < 10) (3 rows) postgres=# explain (verbose, costs off) select /*+ PARALLEL(DEFAULT) */ * from t1 where id < 10; QUERY PLAN ------------------------------------------- PX Coordinator 2:1 (slice1; segments: 2) Output: id -> Partial Seq Scan on public.t1 Output: id Filter: (t1.id < 10) Optimizer: PolarDB PX Optimizer (6 rows) postgres=# explain (verbose, costs off) select /*+ PARALLEL(4) */ * from t1 where id < 10; QUERY PLAN ------------------------------------------- PX Coordinator 8:1 (slice1; segments: 8) Output: id -> Partial Seq Scan on public.t1 Output: id Filter: (t1.id < 10) Optimizer: PolarDB PX Optimizer (6 rows) postgres=# explain (verbose, costs off) select /*+ PARALLEL(0) */ * from t1 where id < 10; QUERY PLAN ------------------------ Seq Scan on public.t1 Output: id Filter: (t1.id < 10) (3 rows) postgres=# explain (verbose, costs off) select /*+ NO_PARALLEL(t1) */ * from t1 where id < 10; QUERY PLAN ------------------------ Seq Scan on public.t1 Output: id Filter: (t1.id < 10) (3 rows)Results of specifying different settings for the three levels of Elastic Parallel Query
Tabel berikut menjelaskan aturan yang diterapkan pada hasil kueri Anda ketika Anda menentukan pengaturan berbeda untuk tiga tingkat Elastic Parallel Query.
Tingkat sistem
Tingkat sesi
Tingkat kueri
Hasil
polar_enable_px=on
polar_px_dop_per_node=X
aktifkan
Tidak ada petunjuk yang ditentukan
Eksekusi paralel dengan derajat paralelisme X
polar_enable_px=on
polar_px_dop_per_node=X
aktifkan
PARALLEL(Y)
Eksekusi paralel dengan derajat paralelisme Y
polar_enable_px=on
polar_px_dop_per_node=X
aktifkan
NO_PARALLEL
Eksekusi serial
polar_enable_px=on
polar_px_dop_per_node=X
nonaktifkan
Tidak ada petunjuk yang ditentukan
Eksekusi serial
polar_enable_px=on
polar_px_dop_per_node=X
nonaktifkan
PARALLEL(Y)
Eksekusi serial
polar_enable_px=on
polar_px_dop_per_node=X
nonaktifkan
NO_PARALLEL
Eksekusi serial
polar_enable_px=on
polar_px_dop_per_node=X
FORCE PARALLEL Z
Tidak ada petunjuk yang ditentukan
Eksekusi paralel dengan derajat paralelisme Z
polar_enable_px=on
polar_px_dop_per_node=X
FORCE PARALLEL Z
PARALLEL(Y)
Eksekusi paralel dengan derajat paralelisme Y
polar_enable_px=on
polar_px_dop_per_node=X
FORCE PARALLEL Z
NO_PARALLEL
Eksekusi serial
polar_enable_px=off
polar_px_dop_per_node=X
aktifkan
Tidak ada petunjuk yang ditentukan
Eksekusi serial
polar_enable_px=off
polar_px_dop_per_node=X
aktifkan
PARALLEL(Y)
Eksekusi paralel dengan derajat paralelisme Y
polar_enable_px=off
polar_px_dop_per_node=X
aktifkan
NO_PARALLEL
Eksekusi serial
polar_enable_px=off
polar_px_dop_per_node=X
nonaktifkan
Tidak ada petunjuk yang ditentukan
Eksekusi serial
polar_enable_px=off
polar_px_dop_per_node=X
nonaktifkan
PARALLEL(Y)
Eksekusi serial
polar_enable_px=off
polar_px_dop_per_node=X
nonaktifkan
NO_PARALLEL
Eksekusi serial
polar_enable_px=off
polar_px_dop_per_node=X
FORCE PARALLEL Z
Tidak ada petunjuk yang ditentukan
Eksekusi paralel dengan derajat paralelisme Z
polar_enable_px=off
polar_px_dop_per_node=X
FORCE PARALLEL Z
PARALLEL(Y)
Eksekusi paralel dengan derajat paralelisme Y
polar_enable_px=off
polar_px_dop_per_node=X
FORCE PARALLEL Z
NO_PARALLEL
Eksekusi serial