PolarDB for PostgreSQL mendukung columnstore indexes (CSI) untuk mempercepat kueri analitis pada dataset besar. Bergantung pada versi kluster Anda, Anda dapat mengaktifkan CSI dengan menambahkan node read-only In-Memory Columnar Index (IMCI) khusus atau langsung menggunakan ekstensi bawaan polar_csi.
Prasyarat
Sebelum memulai, pastikan bahwa:
Kluster Anda menjalankan versi yang didukung: Untuk memeriksa versi mesin minor Anda, jalankan
SHOW polardb_version;atau lihat di Konsol. Jika persyaratan versi belum terpenuhi, tingkatkan versi mesin minor terlebih dahulu.PostgreSQL 16 (versi mesin minor 2.0.16.8.3.0 atau lebih baru)
PostgreSQL 14 (versi mesin minor 2.0.14.10.20.0 atau lebih baru)
Parameter
wal_leveldiatur kelogical. Ini mengaktifkan dukungan replikasi logis dalam write-ahead log (WAL).CatatanMengubah parameter
wal_leveldi Konsol akan me-restart kluster. Rencanakan Jendela pemeliharaan Anda sesuai kebutuhan.Setiap tabel yang diindeks memiliki primary key, dan kolom primary key tersebut disertakan dalam indeks penyimpanan kolom.
Batasan
Setiap tabel hanya mendukung satu indeks penyimpanan kolom.
Memodifikasi indeks penyimpanan kolom yang sudah ada tidak didukung. Untuk menambahkan kolom, hapus dan buat ulang indeks tersebut.
Aktifkan fitur indeks penyimpanan kolom
Pilih metode pengaktifan
Metode yang tersedia bergantung pada versi mesin minor Anda.
Untuk PostgreSQL 16 (2.0.16.9.8.0 atau lebih baru) atau PostgreSQL 14 (2.0.14.17.35.0 atau lebih baru)
Tersedia dua metode. Pilih berdasarkan kebutuhan isolasi workload dan biaya Anda:
| Tambahkan node read-only IMCI (disarankan) | Gunakan ekstensi pra-instal | |
|---|---|---|
| Setup | Tambahkan node melalui Konsol | Tidak perlu setup; ekstensi sudah pra-instal |
| Memory | Mesin penyimpanan kolom memiliki akses eksklusif ke seluruh memori node | Mesin penyimpanan kolom dibatasi hingga 25% dari memori node |
| Isolasi workload | Workload transactional processing (TP) dan analytical processing (AP) berjalan di node terpisah | Workload TP dan AP berbagi node yang sama |
| Biaya | Dikenakan biaya tambahan, ditagih dengan tarif yang sama seperti node komputasi reguler | Tidak ada biaya tambahan |
Untuk PostgreSQL 16 (2.0.16.8.3.0 hingga 2.0.16.9.8.0) atau PostgreSQL 14 (2.0.14.10.20.0 hingga 2.0.14.17.35.0)
Hanya tersedia satu metode: instal ekstensi polar_csi secara manual. Lihat Instal ekstensi polar_csi.
Tambahkan node read-only IMCI
Anda dapat menambahkan node read-only IMCI saat membeli kluster atau setelah kluster berjalan.
Kluster harus memiliki setidaknya satu node read-only sebelum Anda dapat menambahkan node IMCI. Kluster single-node tidak didukung.
Tambahkan saat pembelian
Di halaman pembelian PolarDB, atur jumlah node untuk parameter IMCI Read-Only Nodes.

Tambahkan di Konsol
Login ke Konsol PolarDB dan buka wilayah tempat kluster Anda berada. Buka wizard Add/Remove Node dengan salah satu metode berikut:
Di halaman Clusters, klik Add/Remove Node di kolom Actions.

Di halaman Basic Information kluster Anda, klik Add/Remove Node di bagian Database Nodes.

Pilih Add Read-only IMCI Node dan klik OK.
Di halaman upgrade/downgrade, konfigurasi dan beli node:

Klik Add an IMCI Node dan pilih spesifikasi node.
Pilih waktu switchover.
(Opsional) Tinjau Ketentuan Layanan Produk dan Service Level Agreement.
Klik Buy Now.
Kembali ke halaman detail kluster dan tunggu hingga status node berubah menjadi Running.

Instal ekstensi polar_csi
Akun database yang digunakan untuk menginstal ekstensi harus merupakan Akun istimewa.
Ekstensi polar_csi bersifat cakupan tingkat database. Untuk menggunakan CSI di beberapa database dalam satu kluster, instal ekstensi tersebut di setiap database secara terpisah.
Gunakan metode ini untuk kluster yang menjalankan PostgreSQL 16 (2.0.16.8.3.0 hingga 2.0.16.9.8.0) atau PostgreSQL 14 (2.0.14.10.20.0 hingga 2.0.14.17.35.0). Untuk versi yang lebih baru, ekstensi sudah pra-instal.
Instal dari Konsol
Login ke Konsol PolarDB dan klik ID kluster untuk membuka halaman detail kluster.
Di panel navigasi kiri, pilih Settings and Management > Extension Management.
Di tab Extension Management, pilih Uninstalled Extensions.
Di pojok kanan atas, pilih database target. Di baris polar_csi, klik Install. Di kotak dialog, pilih Database Account target dan klik OK.

Instal dari command line
Sambungkan ke kluster database dan jalankan pernyataan berikut di database target:
CREATE EXTENSION polar_csi;Buat indeks penyimpanan kolom
Sintaks
Gunakan klausa USING CSI untuk membuat indeks penyimpanan kolom. Sertakan CONCURRENTLY untuk menghindari pemblokiran operasi tulis selama pembuatan indeks.
-- Indeks kolom tertentu
CREATE INDEX [ CONCURRENTLY ] <index_name> ON <table_name> USING CSI(<column1>, <column2>, ...);
-- Indeks semua kolom
CREATE INDEX [ CONCURRENTLY ] <index_name> ON <table_name> USING CSI;Parameter
| Parameter | Deskripsi |
|---|---|
CONCURRENTLY | Opsional. Membuat indeks tanpa memblokir operasi tulis pada tabel sumber. Gunakan ini untuk tabel online yang sudah ada. Lihat catatan di bawah untuk persyaratan versi. |
<index_name> | Nama indeks penyimpanan kolom. |
<table_name> | Nama tabel yang akan diindeks. |
<column1>, <column2>, ... | Kolom yang akan disertakan. Jika dihilangkan, semua kolom akan diindeks. |
CONCURRENTLYmemerlukan PostgreSQL 14 dengan versi mesin minor 2.0.14.13.27.0 atau lebih baru. Versi ini juga mengaktifkan fitur logical replication slot secara default. Pada versi lama, instal ulang ekstensipolar_csiatau hubungi dukungan. Selama pembuatan indeks secara konkuren, sebuah logical replication slot sementara dibuat dan dilepas secara otomatis setelah sinkronisasi data selesai.
Contoh
Buat tabel uji dengan primary key:
CREATE TABLE sales (sale_id int primary key, name CHAR(10), amount int);Buat indeks penyimpanan kolom. Pilih salah satu opsi berikut:
Tujuan Pernyataan Indeks kolom tertentu CREATE INDEX idx_csi_sales ON sales USING CSI(sale_id, amount);Indeks semua kolom CREATE INDEX idx_csi_sales ON sales USING CSI;Indeks kolom tertentu tanpa memblokir tulis CREATE INDEX CONCURRENTLY idx_csi_sales ON sales USING CSI(sale_id, amount);Verifikasi bahwa indeks telah dibuat:
SELECT * FROM pg_indexes WHERE tablename = 'sales';
Monitor progres pembuatan indeks
Untuk tabel besar, pembuatan indeks dapat memakan waktu cukup lama. Periksa progres dengan:
SELECT * FROM pg_stat_progress_create_index;Kolom utama yang perlu diperhatikan:
| Kolom | Apa yang Dijelaskan |
|---|---|
phase | Fase saat ini dalam pembuatan indeks (misalnya, building index) |
blocks_done / blocks_total | Progres melalui tabel |
tuples_done / tuples_total | Jumlah baris yang telah diproses |
Ketika blocks_done sama dengan blocks_total dan tuples_done sama dengan tuples_total, indeks telah selesai.
Batalkan pembuatan indeks
Jika pembuatan indeks memakan waktu terlalu lama dan memengaruhi workload Anda, batalkan menggunakan process ID (pid) dari pg_stat_progress_create_index:
-- Batalkan secara graceful
SELECT pg_cancel_backend(<pid>);
-- Hentikan paksa
SELECT pg_terminate_backend(<pid>);Periksa ukuran indeks
SELECT pg_size_pretty(pg_relation_size('idx_csi_sales'));Konfigurasi sinkronisasi data real-time
Setelah Anda membuat indeks penyimpanan kolom, data baru yang ditulis ke tabel row-store secara otomatis disinkronkan ke indeks secara real-time. Tidak diperlukan konfigurasi tambahan.
Untuk menyesuaikan performa sinkronisasi dalam skenario tulis intensif (PostgreSQL 14, versi mesin minor 2.0.14.13.28.0 atau lebih baru), sesuaikan:
| Parameter | Rentang | Default | Efek |
|---|---|---|---|
polar_csi.update_interval | 0–3.600 detik | 3 detik | Interval sinkronisasi. Meningkatkan nilai ini mengelompokkan transaksi kecil, meningkatkan throughput saat volume tulis tinggi. |
polar_csi.update_batch_count | 1.024–4.294.967.295 | 100.000 | Jumlah maksimum baris per Pembaruan batch. Meningkatkan nilai ini meningkatkan efisiensi pembaruan untuk transaksi besar. |
Parameter ini hanya tersedia pada PostgreSQL 14 (versi mesin minor 2.0.14.13.28.0 atau lebih baru). PostgreSQL 16 tidak memiliki parameter setara.
Gunakan indeks penyimpanan kolom
Aktifkan routing kueri
Secara default, kueri tidak menggunakan indeks penyimpanan kolom. Aktifkan pada cakupan yang sesuai dengan kasus penggunaan Anda:
Cakupan global
(semua database, semua session)
Atur parameter polar_csi.enable_query ke on di Konsol.
Cakupan session
(hanya session saat ini)
SET polar_csi.enable_query = ON;Cakupan per-kueri
(satu pernyataan)
Ini memerlukan ekstensi pg_hint_plan. Instal terlebih dahulu:
CREATE EXTENSION pg_hint_plan;Kemudian gunakan komentar petunjuk dalam kueri Anda:
-- Arahkan satu kueri ke indeks penyimpanan kolom
/*+ SET(polar_csi.enable_query on) */ SELECT COUNT(*) FROM sales;
-- Arahkan satu kueri dan atur threshold biaya
/*+ SET(polar_csi.enable_query on) SET(polar_csi.cost_threshold 0) */ SELECT COUNT(*) FROM sales;Kontrol threshold biaya
Parameter polar_csi.cost_threshold menentukan kapan mesin penyimpanan kolom digunakan. Jika estimasi biaya kueri berada di bawah ambang batas, mesin row-store menangani kueri; jika di atas, mesin penyimpanan kolom yang menangani.
SET polar_csi.cost_threshold = 0;Mengaturpolar_csi.cost_thresholdke0memaksa semua kueri menggunakan indeks penyimpanan kolom, termasuk pencarian sederhana yang mungkin lebih cepat di row store. Hindari pengaturan ini di lingkungan produksi. Sesuaikan ambang batas berdasarkan workload aktual Anda.
Verifikasi bahwa kueri menggunakan indeks penyimpanan kolom
Gunakan EXPLAIN untuk memeriksa Rencana kueri. Kueri yang menggunakan indeks penyimpanan kolom akan menampilkan CSI Executor dalam output rencana:
SHOW polar_csi.cost_threshold;
EXPLAIN SELECT COUNT(*) FROM sales;Output yang diharapkan:
QUERY PLAN
--------------
CSI Executor
(1 row)Jika Anda tidak melihat CSI Executor, lihat Pemecahan Masalah.
Konfigurasi konsistensi kueri
Indeks penyimpanan kolom mendukung dua Tingkat konsistensi:
| Tingkat | Nilai parameter | Perilaku | Kapan digunakan |
|---|---|---|---|
| konsistensi akhir (default) | polar_csi.forward_replay_wait = off | Kueri mungkin mengembalikan data yang sedikit usang jika proses penulisan sedang berlangsung | Workload dengan volume tulis tinggi di mana data near-real-time dapat diterima |
| konsistensi kuat | polar_csi.forward_replay_wait = on | Kueri menunggu data penyimpanan kolom tersinkronisasi dengan row store sebelum mengembalikan hasil | Kueri yang harus mencerminkan hasil penulisan terbaru |
-- Aktifkan konsistensi kuat
SET polar_csi.forward_replay_wait = on;Di bawah tekanan tulis tinggi, konsistensi kuat dapat menyebabkan kueri menunggu lebih lama. Aktifkan hanya jika kasus penggunaan Anda memerlukannya.
Hapus dan bangun ulang indeks penyimpanan kolom
Indeks penyimpanan kolom tidak dapat dimodifikasi langsung. Untuk menambah atau menghapus kolom, hapus indeks tersebut dan buat ulang, atau rebuild.
Hapus indeks penyimpanan kolom
DROP INDEX idx_csi_sales;Rebuild indeks penyimpanan kolom
REINDEX INDEX idx_csi_sales;Tuning performa
Percepat pembuatan indeks
| Parameter | Rentang | Default | Deskripsi |
|---|---|---|---|
polar_csi.memory_limit | 1–1.048.576 MB | 1.024 MB | Memori yang tersedia untuk mesin penyimpanan kolom. Nilai yang lebih tinggi mempercepat pembuatan indeks. Pertahankan nilai ini pada atau di bawah 20% dari total memori kluster untuk menghindari error kehabisan memori (OOM). |
polar_csi.flush_count | 2.048–20.480.000 | 204.800 | Jumlah baris per commit batch. Meningkatkan nilai ini meningkatkan throughput tetapi memerlukan lebih banyak memori. |
Percepat kueri
| Parameter | Rentang | Default | Deskripsi |
|---|---|---|---|
polar_csi.exec_parallel | 1–512 | 2 | Tingkat paralelisme per kueri. Nilai yang lebih tinggi meningkatkan performa pada kueri yang memindai dataset besar. Pertahankan nilai ini pada atau di bawah jumlah core CPU pada node komputasi. |
polar_csi.memory_limit | 1–1.048.576 MB | 1.024 MB | Memori yang tersedia untuk mesin penyimpanan kolom. Pertahankan nilai ini pada atau di bawah 20% dari total memori kluster untuk menghindari error OOM. |
polar_csi.cost_threshold | 1–1.000.000.000 | 50.000 (PG14); 1.000 (PG16) | Ambang batas biaya kueri untuk routing ke penyimpanan kolom. Nilai yang sangat tinggi dapat mencegah kueri kompleks menggunakan indeks; nilai yang sangat rendah dapat mengarahkan kueri sederhana ke penyimpanan kolom, mengurangi konkurensi. Sesuaikan berdasarkan workload Anda. |
polar_csi.forward_replay_wait | on | off | off | Tingkat konsistensi. off = konsistensi akhir; on = konsistensi kuat (kueri menunggu sinkronisasi). |
Untuk PostgreSQL 14, nilai default polar_csi.cost_threshold diubah menjadi 50.000 pada versi mesin minor 2.0.14.13.28.0. Versi sebelumnya menggunakan nilai default 1.000.Pemecahan Masalah
Kueri tidak menggunakan indeks penyimpanan kolom
Jika EXPLAIN tidak menampilkan CSI Executor, lakukan pemeriksaan berikut secara berurutan:
Konfirmasi `polar_csi.enable_query` aktif.
SHOW polar_csi.enable_query;Jika output adalah
off, aktifkan:SET polar_csi.enable_query = ON;Periksa threshold biaya.
SHOW polar_csi.cost_threshold; EXPLAIN SELECT COUNT(*) FROM sales;Bandingkan estimasi biaya kueri (dari output
EXPLAIN) dengan ambang batas. Jika biaya lebih rendah dari ambang batas, mesin row-store menangani kueri sesuai desain. Turunkan ambang batas atau gunakan petunjuk per-kueri untuk memaksa routing ke penyimpanan kolom saat pengujian.Verifikasi bahwa indeks penyimpanan kolom mencakup kolom yang dikueri.
SELECT * FROM pg_indexes WHERE tablename = 'sales';Jika indeks tidak mencakup kolom yang dirujuk dalam kueri, hapus dan buat ulang dengan kolom yang benar.
Periksa fitur yang tidak didukung. Tinjau batasan untuk memastikan bahwa kueri dan konfigurasi tabel memenuhi semua persyaratan.