Anda dapat mengaktifkan dan menggunakan fitur In-Memory Column Index (IMCI) untuk PolarDB for PostgreSQL dengan dua cara: menambahkan node read-only IMCI atau menggunakan ekstensi pra-instal. Pilih metode yang paling sesuai dengan kebutuhan Anda.
Prasyarat
-
Versi kluster:
-
PostgreSQL 14 (versi mesin minor 2.0.14.10.20.0 atau lebih baru)
-
PostgreSQL 15 (versi mesin minor 2.0.15.15.7.0 atau lebih baru)
-
PostgreSQL 16 (versi mesin minor 2.0.16.8.3.0 atau lebih baru)
-
PostgreSQL 17 (versi mesin minor 2.0.17.7.5.0 atau lebih baru)
CatatanAnda dapat melihat versi mesin minor di konsol atau dengan menjalankan pernyataan
SHOW polardb_version;. Jika versi mesin minor tidak memenuhi persyaratan, tingkatkan versi mesin minor. -
-
Parameter
wal_levelharus diatur kelogical. Pengaturan ini menambahkan informasi yang diperlukan untuk logical decoding ke write-ahead logging (WAL).CatatanAnda dapat mengatur parameter wal_level di konsol. Mengubah parameter ini akan me-restart kluster. Rencanakan operasi bisnis Anda dengan tepat dan lakukan dengan hati-hati.
-
Tabel sumber harus memiliki primary key, dan kolom kunci primer harus disertakan saat Anda membuat indeks penyimpanan kolom. Disarankan menggunakan tipe data
SERIALatauBIGSERIALuntuk primary key karena secara signifikan meningkatkan efisiensi sinkronisasi data. -
Anda hanya dapat membuat satu indeks penyimpanan kolom untuk setiap tabel.
Aktifkan fitur IMCI
Metode untuk mengaktifkan IMCI bervariasi tergantung pada versi mesin minor kluster PolarDB for PostgreSQL Anda:
Buat indeks penyimpanan kolom
1. Buat indeks penyimpanan kolom
Sintaks
-- Buat indeks untuk kolom tertentu
CREATE INDEX [ CONCURRENTLY ] csi_index_name ON table_name USING CSI(column1,column2,...);
-- Buat indeks untuk semua kolom
CREATE INDEX [ CONCURRENTLY ] csi_index_name ON table_name USING CSI;
Parameter
|
Parameter |
Deskripsi |
|
CONCURRENTLY |
Opsi. Membuat indeks secara konkuren, yang menghindari pemblokiran operasi tulis pada tabel sumber. Metode ini ideal untuk membuat indeks pada tabel yang sedang aktif. Catatan
|
|
csi_index_name |
Nama kustom untuk indeks penyimpanan kolom. |
|
table_name |
Nama tabel tempat indeks penyimpanan kolom akan dibuat. |
|
column1,column2,... |
Kolom-kolom yang akan disertakan dalam indeks penyimpanan kolom. Jika tidak ada kolom yang ditentukan, indeks dibuat untuk semua kolom tabel. |
Contoh
-
Buat tabel contoh bernama
sales.CREATE TABLE sales (sale_id int primary key, name CHAR(10), amount int); -
Karena satu tabel hanya dapat memiliki satu indeks penyimpanan kolom, jalankan salah satu pernyataan berikut.
Kolom tertentu
CREATE INDEX idx_csi_sales ON sales USING CSI(sale_id, amount);Semua kolom
CREATE INDEX idx_csi_sales ON sales USING CSI;Mode Konkuren
Membuat indeks secara konkuren tidak memblokir operasi tulis pada tabel sumber. Metode ini ideal untuk membuat indeks pada tabel yang sedang aktif.
CREATE INDEX CONCURRENTLY idx_csi_sales ON sales USING CSI(sale_id, amount);Setelah indeks dibuat, Anda dapat menjalankan pernyataan berikut untuk melihat informasi indeks:
SELECT * FROM pg_indexes WHERE tablename = 'sales';
2. Lihat progres pembuatan indeks
Membuat indeks penyimpanan kolom pada tabel besar bisa memakan waktu lama. Anda dapat memantau progresnya dengan kueri berikut. Anda juga dapat menyesuaikan parameter terkait untuk meningkatkan kecepatan pembuatan indeks.
SELECT * FROM pg_stat_progress_create_index;
3. (Opsional) Batalkan pembuatan indeks
Jika pembuatan indeks memakan waktu lama dan proses tersebut memengaruhi layanan Anda, Anda dapat menggunakan pg_cancel_backend atau pg_terminate_backend untuk membatalkan pembuatan indeks. Dapatkan pid yang diperlukan seperti yang dijelaskan dalam Langkah 2. Lihat progres pembuatan indeks.
SELECT pg_cancel_backend(pid);
SELECT pg_terminate_backend(pid);
4. Lihat ukuran indeks
Gunakan fungsi pg_relation_size untuk melihat ukuran indeks. Anda dapat menggabungkannya dengan fungsi pg_size_pretty untuk menampilkan ukuran dalam format yang lebih mudah dibaca.
SELECT * FROM pg_size_pretty(pg_relation_size('csi_index_name'));
Sebagai contoh, lihat storage space yang digunakan oleh indeks penyimpanan kolom yang sebelumnya dibuat.
SELECT * FROM pg_size_pretty(pg_relation_size('idx_csi_sales'));
5. (Opsional) Sinkronisasi data real-time
Kluster PolarDB for PostgreSQL tidak hanya mendukung pembuatan indeks penyimpanan kolom pada data historis tetapi juga secara otomatis menyinkronkan data baru dari tabel penyimpanan baris ke indeks penyimpanan kolom. Setelah Anda menggunakan pernyataan CREATE INDEX untuk membuat indeks penyimpanan kolom pada suatu tabel, data baru ditulis ke indeks penyimpanan kolom secara real-time, dan tidak diperlukan operasi tambahan.
IMCI menggunakan mekanisme replikasi logis PolarDB for PostgreSQL untuk menyinkronkan data dengan mendekode log WAL dan menerapkan perubahan ke mesin penyimpanan kolom. Dengan konfigurasi default, mekanisme ini dapat menangani throughput tulis sekitar 200.000 QPS (berdasarkan pengujian standar Sysbench oltp_insert).
-
Periksa latensi sinkronisasi data saat ini
SELECT active_pid, database, slot_name, pg_size_pretty(pg_current_wal_lsn() - confirmed_flush_lsn) AS size FROM pg_replication_slots WHERE slot_name LIKE 'csi_sync_%';Jika
sizetetap di bawah 50 MB, data penyimpanan kolom biasanya diperbarui dalam hitungan detik. -
Tingkatkan efisiensi sinkronisasi data
Untuk memenuhi persyaratan real-time antara data penyimpanan baris dan penyimpanan kolom dalam skenario bisnis tertentu, Anda dapat menyesuaikan parameter
polar_csi.update_intervaldanpolar_csi.update_batch_countuntuk meningkatkan performa real-time indeks penyimpanan kolom.
Gunakan IMCI
1. Konfigurasikan parameter
Setelah membuat indeks penyimpanan kolom, Anda dapat menggunakan parameter berikut untuk mengontrol apakah kueri SQL menggunakan indeks penyimpanan kolom.
|
Parameter |
Deskripsi |
|
polar_csi.enable_query |
Menentukan apakah kueri diizinkan menggunakan IMCI. Nilai yang valid:
|
|
polar_csi.cost_threshold |
Jika perkiraan biaya kueri melebihi ambang batas ini, pengoptimal memilih mesin penyimpanan kolom; jika tidak, mesin penyimpanan baris yang digunakan.
Catatan
Jika Anda mengatur parameter ini ke 0, semua kueri akan memprioritaskan penggunaan indeks penyimpanan kolom. Hindari mengatur nilai ini ke 0 di lingkungan produksi. Sesuaikan nilai ini secara dinamis berdasarkan beban pada mesin penyimpanan baris dan penyimpanan kolom. |
2. Konfigurasikan cakupan parameter
Cakupan global
Anda dapat menggunakan konsol untuk mengatur parameter polar_csi.enable_query ke on. Hal ini memungkinkan kueri di semua database mencoba menggunakan indeks penyimpanan kolom.
Cakupan session
Semua kueri dalam session mencoba menggunakan indeks penyimpanan kolom.
SET polar_csi.enable_query = ON;
Cakupan pernyataan
Satu kueri SQL dalam session dapat menggunakan indeks penyimpanan kolom dengan petunjuk.
Karena fitur ini bergantung pada ekstensi pg_hint_plan, Anda harus menjalankan CREATE EXTENSION pg_hint_plan; di database target untuk menginstalnya.
-
Hanya atur
polar_csi.enable_query.-- Izinkan kueri menggunakan indeks penyimpanan kolom /*+ SET (polar_csi.enable_query on) */ SELECT COUNT(*) FROM sales; -
Atur
polar_csi.enable_querydanpolar_csi.cost_threshold.-- Izinkan kueri menggunakan indeks penyimpanan kolom dan atur ambang batas biaya kueri ke 0 /*+SET (polar_csi.enable_query on) SET(polar_csi.cost_threshold 0)*/ SELECT COUNT(*) FROM sales;
3. Periksa penggunaan indeks
Anda dapat menggunakan EXPLAIN atau EXPLAIN ANALYZE untuk melihat rencana kueri. Jika rencana tersebut mencakup kata kunci CSI Executor, berarti kueri tersebut menggunakan indeks penyimpanan kolom.
EXPLAIN SELECT COUNT(*) FROM sales;
Hasil berikut dikembalikan:
QUERY PLAN
--------------
CSI Executor
(1 row)
4. (Opsional) Konfigurasikan konsistensi kueri IMCI
PolarDB for PostgreSQL menawarkan dua tingkat konsistensi kueri untuk memenuhi kebutuhan bisnis yang berbeda.
-
Konsistensi akhir (default): Cocok untuk workload intensif tulis dengan persyaratan data real-time yang rendah.
-
Konsistensi kuat: Memastikan hasil kueri dikembalikan hanya setelah data di penyimpanan kolom sepenuhnya konsisten dengan data di penyimpanan baris.
PolarDB for PostgreSQL biasanya memiliki latensi dalam orde detik. Namun, latensi data meningkat di bawah beban tulis yang tinggi. Tingkat konsistensi default adalah konsistensi akhir. Oleh karena itu, jika beban tulis tinggi dan kueri SQL menggunakan indeks penyimpanan kolom, kueri tersebut mungkin tidak mengambil data terbaru.
Untuk skenario bisnis yang memerlukan konsistensi kuat antara data penyimpanan baris dan penyimpanan kolom, Anda dapat mengatur parameter polar_csi.forward_replay_wait ke on. Hal ini mengaktifkan pembacaan konsistensi kuat. Saat kueri dijalankan, kueri tersebut menunggu hingga data indeks penyimpanan kolom konsisten dengan data penyimpanan baris sebelum dieksekusi.
Hapus dan bangun ulang indeks penyimpanan kolom
PolarDB for PostgreSQL tidak mendukung modifikasi indeks penyimpanan kolom. Untuk menambahkan kolom ke indeks, Anda harus menghapus dan membuatnya kembali.
Hapus indeks
Sintaks
DROP INDEX csi_index_name;
Parameter
|
Parameter |
Deskripsi |
|
csi_index_name |
Nama indeks penyimpanan kolom yang akan dihapus. |
Contoh
Hapus indeks penyimpanan kolom yang sebelumnya dibuat.
DROP INDEX idx_csi_sales;
Bangun ulang indeks
Sintaks
REINDEX INDEX csi_index_name;
Parameter
|
Parameter |
Deskripsi |
|
csi_index_name |
Nama indeks penyimpanan kolom yang akan dibangun ulang. |
Contoh
Bangun ulang indeks penyimpanan kolom yang sebelumnya dibuat.
REINDEX INDEX idx_csi_sales;
Tuning parameter IMCI
Tingkatkan kecepatan pembuatan indeks
Kecepatan pembuatan indeks bergantung pada parameter berikut:
|
Parameter |
Rentang nilai |
Default |
Deskripsi |
|
polar_csi.memory_limit |
1–1048576 |
4096 |
Ukuran memori yang dapat digunakan oleh IMCI. Satuan: MB. Ambang batas memori yang lebih besar memungkinkan pembuatan indeks lebih cepat. Sesuaikan nilai berdasarkan spesifikasi kluster. Kami menyarankan agar Anda tidak mengatur nilai lebih dari 25% dari memori kluster. Jika tidak, kesalahan kehabisan memori (OOM) dapat terjadi. Catatan
|
|
polar_csi.flush_count |
2048–20480000 |
204800 |
Jumlah baris yang akan dikomit dalam setiap batch saat indeks dibuat. Menambah jumlah baris dapat meningkatkan efisiensi pembuatan, tetapi juga memerlukan lebih banyak memori. |
Tingkatkan performa real-time
Dengan menyesuaikan parameter berikut, Anda dapat meningkatkan kecepatan transformasi baris-ke-kolom dan meningkatkan performa real-time data indeks penyimpanan kolom.
|
Parameter |
Rentang nilai |
Default |
Deskripsi |
|
polar_csi.update_interval |
0–3600 |
1 |
Interval pembaruan berkala untuk performa real-time data baris-kolom. Satuan: detik. Menambah interval pembaruan dapat menggabungkan transaksi kecil dengan jenis yang sama, sehingga meningkatkan efisiensi pembaruan data saat terdapat banyak transaksi. Catatan
|
|
polar_csi.update_batch_count |
1024–4294967295 |
100000 |
Ambang batas jumlah baris untuk diperbarui dalam satu batch. Jumlah maksimum baris dalam satu transaksi pembaruan. Meningkatkan ambang batas ini meningkatkan efisiensi pembaruan data. Catatan
|
Tingkatkan kecepatan kueri
Performa kueri terutama bergantung pada parameter berikut. Anda dapat menyesuaikan nilainya untuk meningkatkan performa kueri:
|
Parameter |
Rentang nilai |
Default |
Deskripsi |
|
polar_csi.max_parallel_workers |
1–512 |
2 |
Tingkat paralelisme IMCI, yaitu resource CPU yang dapat digunakan oleh satu pernyataan SQL. Secara umum, tingkat paralelisme yang lebih tinggi memberikan performa yang lebih baik. Nilai aktual bergantung pada spesifikasi resource kluster Anda. Sesuaikan nilai berdasarkan spesifikasi kluster. Kami menyarankan agar Anda tidak mengatur nilai lebih dari jumlah core CPU pada node komputasi. Catatan
Parameter
|
|
polar_csi.memory_limit |
1–1048576 |
4096 |
Ukuran memori yang dapat digunakan oleh IMCI. Satuan: MB. Ambang batas memori yang lebih besar memungkinkan pembuatan indeks lebih cepat. Sesuaikan nilai berdasarkan spesifikasi kluster. Kami menyarankan agar Anda tidak mengatur nilai lebih dari 25% dari memori kluster. Jika tidak, kesalahan kehabisan memori (OOM) dapat terjadi. Catatan
|
|
polar_csi.cost_threshold |
1–1000000000 |
50000 |
Saat biaya kueri kurang dari ambang batas ini, pernyataan kueri tidak menggunakan IMCI untuk akselerasi. Sesuaikan nilai aktual berdasarkan workload bisnis Anda.
Catatan
|
|
polar_csi.forward_replay_wait |
on|off |
off |
Tingkat konsistensi kueri data IMCI dan IMCI. Nilai yang valid:
|