PolarDB for PostgreSQL memungkinkan Anda untuk menanyakan dan menganalisis rencana eksekusi kueri yang dijalankan menggunakan fitur Elastic Parallel Query (ePQ).
Informasi latar belakang
PostgreSQL menyediakan perintah EXPLAIN yang dapat digunakan untuk menganalisis kinerja pernyataan SQL. Output dari perintah ini adalah rencana kueri dari pernyataan SQL, termasuk informasi seperti waktu dan sumber daya yang dikonsumsi selama eksekusi. Perintah ini membantu mengidentifikasi hambatan kinerja SQL.
Namun, perintah EXPLAIN hanya berlaku untuk analisis kinerja pernyataan SQL yang dijalankan pada satu node. Fitur ePQ dari PolarDB for PostgreSQL memperluas kemampuan EXPLAIN sehingga dapat digunakan untuk menanyakan rencana eksekusi kueri paralel multi-node yang dijalankan menggunakan fitur ePQ. Anda juga dapat menggunakan perintah ini untuk mengumpulkan statistik seperti durasi eksekusi, volume pemindaian data, dan penggunaan memori dari rencana eksekusi ePQ pada setiap operator. Informasi ini disajikan kepada pengguna secara seragam.
Prasyarat
Cluster PolarDB for PostgreSQL Anda menjalankan mesin berikut:
PostgreSQL 11 dengan versi revisi 1.1.22 atau lebih baru
PostgreSQL 14 dengan versi revisi 14.6.6.0 atau lebih baru
Oracle 2.0 dengan versi revisi 2.0.14.1.0 atau lebih baru
Anda dapat menjalankan salah satu pernyataan berikut untuk menanyakan versi revisi cluster PolarDB for PostgreSQL :
PostgreSQL 11
show polar_version;PostgreSQL 14
select version();Oracle 2.0
show polar_version;Cara kerjanya
Koordinator kueri (QC) dari ePQ berkomunikasi dengan pekerja menggunakan protokol Y dari libpq.
QC mengirimkan perintah
EXPLAIN ANALYZEke para pekerja.Setiap pekerja mengumpulkan statistik seperti penggunaan sumber daya dan durasi eksekusi proses lokal.
Setelah eksekusi suatu irisan selesai, setiap pekerja mengirimkan statistik ke QC.
QC menunggu hingga semua pekerja menyelesaikan eksekusi mereka, melakukan perhitungan statistik, dan kemudian menghasilkan output.
Deskripsi fitur
Kueri rencana eksekusi
Rencana eksekusi ePQ dibagi menjadi irisan. Setiap irisan dieksekusi oleh sekelompok proses, yang disebut gang. Proses-proses tersebut dimulai oleh segmen-segmen pada node komputasi untuk menyelesaikan sebagian perhitungan SQL. ePQ memperkenalkan operator Motion ke dalam rencana eksekusi untuk transfer data antara gang-gang yang mengeksekusi irisan yang berbeda. Oleh karena itu, operator Motion berfungsi sebagai batas untuk irisan.
ePQ memperkenalkan tiga operator Motion berikut:
PX Coordinator: mengumpulkan data sumber ke tujuan yang sama.PX Broadcast: menyiarkan data sumber ke setiap tujuan.PX Hash: meng-hash data sumber dan mengirimkan data ke tujuan untuk redistribusi.
Contoh
Contoh berikut menunjukkan rencana eksekusi dari kueri sederhana:
CREATE TABLE t (id INT); SET polar_enable_px TO ON; EXPLAIN (COSTS OFF) SELECT * FROM t LIMIT 1; QUERY PLAN ------------------------------------------------- Limit -> PX Coordinator 6:1 (slice1; segments: 6) -> Partial Seq Scan on t Optimizer: PolarDB PX Optimizer (4 rows)Rencana eksekusi di atas dibagi menjadi dua irisan oleh operator Motion.
slice0digunakan untuk menerima hasil akhir danslice1digunakan untuk memindai data.ePQ menggunakan enam segmen (
segments: 6), masing-masing memulai proses untuk mengeksekusislice1. Masing-masing dari enam proses tersebut memindai sebagian data dalam tabel (Partial Seq Scan), dan data dari enam proses tersebut di-aggregat oleh operator Motion ke tujuan yang sama (PX Coordinator 6:1), yaitu operatorLimit.Jumlah irisan dan operator Motion dalam rencana eksekusi meningkat seiring dengan kompleksitas kueri. Contoh berikut menunjukkan rencana eksekusi dari kueri yang kompleks:
CREATE TABLE t1 (a INT, b INT, c INT); SET polar_enable_px TO ON; EXPLAIN (COSTS OFF) SELECT SUM(b) FROM t1 GROUP BY a LIMIT 1; QUERY PLAN ------------------------------------------------------------ Limit -> PX Coordinator 6:1 (slice1; segments: 6) -> GroupAggregate Group Key: a -> Sort Sort Key: a -> PX Hash 6:6 (slice2; segments: 6) Hash Key: a -> Partial Seq Scan on t1 Optimizer: PolarDB PX Optimizer (10 rows)Rencana eksekusi di atas memiliki tiga irisan. Enam proses (
segments: 6) dimulai untuk mengeksekusislice2. Masing-masing dari enam proses tersebut memindai sebagian data dalam tabel. Kemudian, operator Motion (PX Hash 6:6) mendistribusikan ulang data ke enam proses lainnya (segments: 6) yang digunakan untuk mengeksekusislice1. Masing-masing dari enam proses tersebut menyelesaikan operasi sortir (Sort) dan agregasi (GroupAggregate). Terakhir, operasi Motion lainnya (PX Coordinator 6:1) meng-aggregat data keslice0.
Analisis rencana eksekusi
Anda dapat menambahkan opsi ANALYZE ke perintah EXPLAIN untuk benar-benar mengeksekusi kueri dan mengumpulkan berbagai statistik selama eksekusi. Dalam hal ini, rencana eksekusi tidak hanya ditampilkan tetapi juga dieksekusi. Dalam rencana eksekusi ePQ, operator dieksekusi oleh sekelompok proses. Perintah EXPLAIN ANALYZE dari ePQ dapat mengumpulkan statistik pada semua proses yang mengeksekusi operator yang sama.
Statistik tingkat operator berikut dikumpulkan:
Durasi eksekusi operator: durasi eksekusi terlama di antara semua proses yang mengeksekusi operator.
Total baris yang dipindai oleh operator: jumlah baris yang dipindai oleh semua proses yang mengeksekusi operator.
Pengulangan eksekusi operator: jumlah pengulangan dari semua proses yang mengeksekusi operator.
Penggunaan sumber daya operator: jumlah penggunaan sumber daya dari semua proses yang mengeksekusi operator.
Selain itu, perintah EXPLAIN ANALYZE dari ePQ dapat mengumpulkan statistik pada setiap proses yang mengeksekusi operator. Hal ini memungkinkan Anda menentukan apakah terjadi skew data selama eksekusi. Statistik tingkat proses berikut dikumpulkan:
Penggunaan memori setiap proses
Durasi eksekusi setiap proses
Jumlah baris yang diproses oleh setiap proses
Contoh
Buat tabel dan sisipkan data ke dalam tabel.
CREATE TABLE t2 (a INT, b INT, c VARCHAR(20)); INSERT INTO t2 SELECT i, i*2, to_char(i, 'FM00000') FROM generate_series(1, 100000) i;Atur parameter yang relevan dan jalankan perintah
EXPLAIN ANALYZE.SET polar_enable_px TO ON; SET polar_px_enable_explain_all_stat TO ON; SET polar_px_explain_memory_verbosity TO detail; EXPLAIN (COSTS OFF, ANALYZE) SELECT * FROM t2; QUERY PLAN ------------------------------------------------------------------------------------------- PX Coordinator 6:1 (slice1; segments: 6) (actual time=0.816..54.225 rows=100000 loops=1) Executor Memory: 9kB Workers: 1 Max: 9kB (worker -1) -> Partial Seq Scan on t2 (actual time=0.052..24.732 rows=94720 loops=1) Executor Memory: 326kB Workers: 6 Max: 145kB (worker 1) allstat: worker:0, first_time:7.396(ms), total_time:25(ms), total_num:94720 worker:1, first_time:7.396(ms), total_time:2.819(ms), total_num:5280 worker:2, first_time:7.393(ms), total_time:0.074(ms), total_num:0 worker:3, first_time:7.400(ms), total_time:0.078(ms), total_num:0 worker:4, first_time:7.402(ms), total_time:0.086(ms), total_num:0 worker:5, first_time:7.399(ms), total_time:0.098(ms), total_num:0 Dynamic Pages Per Worker: [512,29] Planning Time: 9.768 ms Optimizer: PolarDB PX Optimizer (slice0) Executor memory: 38K bytes. (slice1) Executor memory: 68K bytes avg x 6 workers, 164K bytes max (seg1). Execution Time: 65.572 ms (17 rows)Dalam rencana eksekusi di atas:
Bagian
Executor Memoryuntuk setiap operator menampilkan total penggunaan memori dari semua proses yang mengeksekusi operator, jumlah proses, dan ID proses dengan penggunaan memori tertinggi.Bagian
allstatmenampilkan waktu persiapan (first_time), durasi eksekusi (total_time), dan jumlah tupel yang diproses (total_num) untuk setiap proses yang mengeksekusi operator.