全部产品
Search
文档中心

PolarDB:Kueri dan analisis rencana eksekusi ePQ

更新时间:Jul 02, 2025

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

Catatan

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 ANALYZE ke 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. slice0 digunakan untuk menerima hasil akhir dan slice1 digunakan untuk memindai data.

    ePQ menggunakan enam segmen (segments: 6), masing-masing memulai proses untuk mengeksekusi slice1. 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 operator Limit.

  • 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 mengeksekusi slice2. 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 mengeksekusi slice1. Masing-masing dari enam proses tersebut menyelesaikan operasi sortir (Sort) dan agregasi (GroupAggregate). Terakhir, operasi Motion lainnya (PX Coordinator 6:1) meng-aggregat data ke slice0.

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

  1. 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;
  2. 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 Memory untuk setiap operator menampilkan total penggunaan memori dari semua proses yang mengeksekusi operator, jumlah proses, dan ID proses dengan penggunaan memori tertinggi.

    • Bagian allstat menampilkan waktu persiapan (first_time), durasi eksekusi (total_time), dan jumlah tupel yang diproses (total_num) untuk setiap proses yang mengeksekusi operator.