All Products
Search
Document Center

PolarDB:Global plan cache (GPC)

Last Updated:Jan 28, 2026

Topik ini menjelaskan fitur global plan cache (GPC) dari PolarDB for PostgreSQL.

Informasi latar belakang

Pada versi sebelumnya PolarDB, cache rencana terikat pada prepared statements. Pendekatan ini memiliki dua kelemahan:

  • Cache rencana terisolasi pada masing-masing koneksi dan tidak dapat dibagikan.

  • Setiap koneksi mempertahankan cache rencananya sendiri, yang mengakibatkan penggunaan memori tinggi.

PolarDB for PostgreSQL memperkenalkan fitur GPC untuk mengatasi masalah tersebut dengan memungkinkan koneksi berbeda berbagi cache rencana yang sama.

Rencana dapat dibagikan antara prepared statements dan koneksi yang berbeda. Untuk aplikasi dengan banyak pernyataan SQL yang berbeda, GPC secara signifikan mengurangi penggunaan memori dan menurunkan risiko error out-of-memory (OOM). Mekanisme caching rencana yang efisien ini juga mengurangi biaya pembuatan execution plan, sehingga meningkatkan performa.

Rencana hanya dapat dibagikan jika kunci kuerinya sama. Kunci kueri terdiri atas komponen-komponen berikut:

  • Teks kueri.

  • ID database.

  • Jalur pencarian objek (object search path).

  • ID pengguna.

Penerapan

  • Fitur ini tersedia untuk versi-versi berikut PolarDB for PostgreSQL:

    • PostgreSQL 18 (versi mesin minor 2.0.18.0.1.0 atau lebih baru)

    • PostgreSQL 17 (versi mesin minor 2.0.17.2.1.0 atau lebih baru)

    • PostgreSQL 16 (versi mesin minor 2.0.16.3.1.1 atau lebih baru)

    • PostgreSQL 15 (versi mesin minor 2.0.15.7.1.1 atau lebih baru)

    • PostgreSQL 14 (versi mesin minor 2.0.14.9.15.0 atau lebih baru)

    • PostgreSQL 11 (versi mesin minor 2.0.11.9.28.0 atau lebih baru)

    Catatan

    Anda dapat melihat nomor versi mesin minor di Konsol atau menjalankan pernyataan SHOW polardb_version;. Jika kluster Anda tidak memenuhi persyaratan versi mesin minor, upgrade versi mesin minor.

  • Fitur GPC diaktifkan secara default pada kluster yang memenuhi persyaratan versi.

Batasan

  • GPC hanya mendukung prepared statements. Caching rencana tidak didukung dalam skenario PL/SQL.

  • Hanya pernyataan SELECT, INSERT, UPDATE, dan DELETE yang didukung.

  • Tabel temporary tidak didukung.

Parameter

Parameter

Deskripsi

polar_gpc_mem

Mengatur ukuran memori untuk GPC. Satuan: MB. Nilai default adalah 30 MB. Nilainya tidak boleh melebihi ukuran shared_buffer.

Catatan
  • Lakukan restart kluster agar modifikasi parameter berlaku.

  • Jika polar_gpc_mem kurang dari atau sama dengan 0, fitur GPC dinonaktifkan. Jika polar_gpc_mem lebih besar dari 0, kluster akan menyisihkan jumlah memori bersama yang ditentukan saat startup. Jika memori bersama tidak mencukupi, cache rencana baru sementara disimpan secara lokal. Saat entri GPC yang jarang digunakan atau tidak valid dibersihkan, memori bersama akan dilepaskan. Sistem kemudian mencoba memindahkan cache rencana lokal ke GPC.

polar_enable_gpc_level

Tingkat penerapan fitur GPC. Parameter ini dapat dimodifikasi secara dinamis. Nilai yang valid:

  • 0 (Default): GPC tidak digunakan.

  • 1: GPC hanya digunakan pada node read-only (RO).

  • 2: GPC digunakan pada node primary (RW) dan node read-only.

Catatan
  • Parameter ini harus digunakan bersama polar_gpc_mem. GPC hanya berfungsi ketika polar_gpc_mem lebih besar dari 0 dan polar_enable_gpc_level lebih besar dari 0.

  • Jika polar_gpc_mem lebih besar dari 0 dan polar_enable_gpc_level bernilai 0, kueri yang sudah ada tetap dapat menggunakan GPC, tetapi kueri baru tidak dapat.

polar_gpc_clean_timeout

Interval waktu untuk membersihkan entri GPC yang jarang digunakan. Parameter ini dapat dimodifikasi secara dinamis. Satuan: detik. Nilai default adalah 1800 detik. Nilainya berkisar antara 0 detik hingga 24 jam.

polar_worker.gpc_clear_interval

Interval waktu untuk membersihkan entri GPC yang tidak valid. Parameter ini dapat dimodifikasi secara dinamis. Satuan: detik. Nilai default adalah 60 detik. Nilai maksimum adalah (2^32 - 1)/1000.

polar_gpc_clean_max

Jumlah entri GPC yang dibersihkan dalam satu waktu. Parameter ini dapat dimodifikasi secara dinamis. Nilai default adalah 100. Rentang nilainya adalah 10 hingga 10000.

polar_gpc_partitions

Jumlah tabel hash yang digunakan untuk menyimpan entri GPC. Nilai default adalah 32. Rentang nilainya adalah 1 hingga 1024.

Catatan

Lakukan restart kluster agar modifikasi parameter berlaku.

polar_gpc_entries

Jumlah maksimum entri dalam setiap tabel hash. Nilai default adalah 1024. Rentang nilainya adalah 1 hingga 10000.

Catatan

Lakukan restart kluster agar modifikasi parameter berlaku.

Panduan penggunaan

Tampilan dan fungsi pemantauan untuk fitur GPC termasuk dalam ekstensi polar_gpc. Anda dapat menjalankan perintah berikut untuk membuat ekstensi ini.

CREATE EXTENSION IF NOT EXISTS polar_gpc;

Tampilan

polar_stat_gpc - Melihat penggunaan keseluruhan GPC

Anda dapat memeriksa penggunaan keseluruhan GPC dari tampilan polar_stat_gpc sebagai berikut:

SELECT * FROM polar_stat_gpc;

Metrik utama dalam tampilan polar_stat_gpc meliputi hal-hal berikut:

  • get: Jumlah upaya untuk mengambil entri GPC yang cocok.

  • hit: Jumlah kali entri GPC yang cocok ditemukan.

  • store: Jumlah kali rencana berhasil disimpan ke GPC.

  • store_failed: Jumlah kali penyimpanan rencana gagal karena error kehabisan memori sementara di GPC. Peningkatan nilai ini secara sering menunjukkan bahwa parameter polar_gpc_mem diatur terlalu rendah.

  • store_exists: Jumlah kali sistem mencoba menambahkan cache rencana lokal ke GPC tetapi menemukan bahwa sesi lain telah menambahkan rencana tersebut.

polar_gpc_plan - Melihat penggunaan memori setiap entri GPC

Anda dapat mengkueri tampilan polar_gpc_plan untuk melihat penggunaan memori setiap entri GPC. Contohnya:

SELECT * FROM polar_gpc_plan;

Metrik utama dalam tampilan polar_gpc_plan meliputi hal-hal berikut:

  • plan_id: ID dari execution plan.

  • stmt_name: Nama prepared statement.

  • query: Pernyataan kueri.

  • used_cnt: Jumlah kali rencana telah digunakan.

  • last_use_time: Waktu terakhir entri GPC digunakan.

  • is_valid: Menentukan apakah rencana valid.

polar_gpc_plan_mcxt - Melihat informasi MemoryContext untuk setiap entri GPC

Anda dapat mengkueri tampilan polar_gpc_plan_mcxt untuk melihat informasi MemoryContext untuk setiap entri GPC. Contohnya:

SELECT * FROM polar_gpc_plan_mcxt;

Metrik utama dalam tampilan polar_gpc_plan_mcxt meliputi hal-hal berikut:

  • plan_id: ID dari execution plan.

  • mcxt_name: Nama MemoryContext.

  • totalspace: Total ruang memori.

  • freespace: Ruang memori yang tersedia.

  • used: Ruang memori yang digunakan.

  • nblocks: Jumlah blok.

polar_gpc_plan_key - Melihat kunci GPC untuk setiap entri GPC

Anda dapat mengkueri tampilan polar_gpc_plan_key untuk melihat kunci GPC untuk setiap entri GPC. Kunci ini digunakan untuk menemukan entri GPC yang cocok. Contohnya:

SELECT * FROM polar_gpc_plan_key;

Metrik utama dalam tampilan polar_gpc_plan_key meliputi hal-hal berikut:

  • plan_id: ID dari rencana.

  • query: Pernyataan kueri.

  • dbid: ID database.

  • pid: ID proses.

  • num_params: Jumlah parameter dalam pernyataan kueri.

  • search_path: Jalur pencarian.

  • role_id: ID pengguna.

polar_prepared_statement - Melihat informasi semua prepared statement dalam GPC

Anda dapat mengkueri tampilan polar_prepared_statement untuk melihat informasi tentang semua prepared statements dalam GPC. Contohnya:

SELECT * FROM polar_prepared_statement;

Metrik utama dalam tampilan polar_prepared_statement meliputi hal-hal berikut:

  • is_saved: Menunjukkan apakah execution plan dari prepared statement disimpan ke GPC.

  • is_valid: Menunjukkan apakah rencana tersebut valid.

  • cacheable: Menunjukkan apakah rencana tersebut dapat dicache.

Fungsi

polar_gpc_evict_invalid_gpc - Membersihkan entri GPC yang tidak valid secara manual

Anda dapat menggunakan fungsi polar_gpc_evict_invalid_gpc untuk membersihkan entri GPC yang tidak valid secara manual. Contohnya:

SELECT polar_gpc_evict_invalid_gpc();

Jika Anda tidak memanggil fungsi ini, sistem secara otomatis membersihkan entri GPC yang tidak valid sesuai interval yang ditentukan oleh parameter $polar_worker.gpc_clear_interval.

polar_gpc_evict_live_gpc - Menghapus entri GPC yang jarang digunakan secara manual

Anda dapat menggunakan fungsi polar_gpc_evict_live_gpc untuk menghapus entri GPC yang jarang digunakan secara manual. Contohnya:

SELECT polar_gpc_evict_live_gpc(); 

Jika Anda tidak memanggil fungsi ini, sistem secara otomatis menghapus entri GPC yang jarang digunakan sesuai interval yang ditentukan oleh parameter $polar_worker.gpc_clear_interval.