Tabel lebar dapat memiliki puluhan hingga ratusan kolom. Kueri sering kali hanya perlu menganalisis beberapa kolom tersebut. Anda dapat menggunakan indeks penyimpanan kolom (columnstore index) untuk mempercepat kueri ini.
Informasi latar belakang
Di banyak sistem bisnis SaaS, sebuah tabel mungkin memiliki puluhan hingga ratusan kolom, yang menimbulkan tantangan teknis bagi kueri.
Hanya beberapa kolom yang relevan untuk analisis dalam beberapa kueri, namun banyak kolom tidak relevan yang tetap dibaca saat menggunakan mesin penyimpanan berorientasi baris. Hal ini meningkatkan beban I/O pada sistem.
Mode kueri tidak selalu tetap. Beberapa kondisi filter dapat digunakan ketika Anda menjalankan kueri terhadap ratusan kolom. Saat membuat indeks gabungan, semua skenario kueri harus dipertimbangkan terlebih dahulu. Jika kondisi kueri berubah, indeks gabungan menjadi tidak valid.
Indeks penyimpanan kolom sangat cocok untuk kedua skenario tersebut. Karena indeks penyimpanan kolom bersifat berbasis kolom, membaca satu kolom tidak memengaruhi kolom lainnya. Kolom-kolom tersebut juga bersifat independen, sehingga urutan beberapa kondisi filter tidak memengaruhi efektivitas indeks penyimpanan kolom.
Hasil
Dengan set data berukuran 100 juta baris dan tingkat paralelisme sebesar 4, kueri yang menggunakan indeks penyimpanan kolom berjalan 30 kali lebih cepat dibandingkan eksekusi paralel native di PostgreSQL.
Query | Eksekusi paralel di PostgreSQL asli | Indeks penyimpanan kolom |
Q1 | 243 dtk | 7,9 dtk |
Prosedur
Langkah 1: Siapkan lingkungan
Pastikan versi dan konfigurasi kluster Anda memenuhi persyaratan berikut:
Versi kluster:
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)
CatatanAnda dapat melihat nomor versi mesin minor di Konsol atau dengan menjalankan pernyataan
SHOW polardb_version;. Jika versi mesin minor tidak memenuhi persyaratan, Anda harus meningkatkan versi mesin minor.Tabel sumber harus memiliki kunci primer. Kolom kunci primer harus disertakan saat Anda membuat indeks penyimpanan kolom.
Parameter
wal_levelharus diatur kelogical. Hal ini menambahkan informasi yang diperlukan untuk mendukung replikasi logis ke dalam write-ahead logging (WAL).CatatanAnda dapat mengatur parameter wal_level di Konsol. Mengubah parameter ini akan me-restart kluster. Rencanakan operasi bisnis Anda dengan cermat dan lanjutkan secara hati-hati.
Aktifkan fitur indeks penyimpanan kolom.
Cara mengaktifkan fitur indeks penyimpanan kolom bervariasi tergantung pada versi mesin minor kluster PolarDB for PostgreSQL Anda:
Langkah 2: Siapkan data
Contoh ini menggunakan tabel bernama widecolumntable yang berisi 24 kolom dengan tipe data seperti BIGINT, DECIMAL, TEXT, JSONB, dan TEXT[]. Contoh ini menganalisis lima kolom (id_1, domain, consumption, start_time, dan end_time) untuk menghitung total pengeluaran tiap pelanggan di berbagai domain selama satu tahun terakhir.
Buat tabel bernama
widecolumntabledengan skema tabel berikut. Kemudian, masukkan data uji sesuai kebutuhan.CREATE TABLE widecolumntable ( id_1 BIGINT NOT NULL PRIMARY KEY, id_2 BIGINT, id_3 BIGINT, id_4 BIGINT, id_5 BIGINT, id_6 BIGINT, version INT, domain TEXT, consumption DECIMAL(18,3), c_level CHARACTER varying(1) NOT NULL, priority BIGINT, operator TEXT, notify_policy TEXT, call_id UUID NOT NULL, provider_id BIGINT NOT NULL, name_1 TEXT NOT NULL, name_2 TEXT NOT NULL, name_3 TEXT, start_time TIMESTAMP WITH TIME ZONE NOT NULL, end_time TIMESTAMP WITH TIME ZONE NOT NULL, comment JSONB NOT NULL, description TEXT[] NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL, updated_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL );Tambahkan kolom
id_1,domain,consumption,start_time, danend_timeke dalam indeks penyimpanan kolom.CREATE INDEX idx_wide_csi ON widecolumntable USING CSI(id_1, domain, consumption, start_time, end_time);
Langkah 3: Jalankan kueri
Gunakan mesin eksekusi yang berbeda untuk menjalankan kueri yang menghitung total pengeluaran tiap pelanggan di berbagai domain selama satu tahun terakhir dan mengurutkan hasil berdasarkan total pengeluaran.
Gunakan indeks penyimpanan kolom.
--- Aktifkan indeks penyimpanan kolom dan atur tingkat paralelisme ke 4. SET polar_csi.enable_query to on; SET polar_csi.exec_parallel to 4; ---Q1 EXPLAIN ANALYZE SELECT id_1, domain,SUM(consumption) FROM widecolumntable WHERE start_time > '20230101' and end_time < '20240101' GROUP BY id_1, domain Order By SUM(consumption);Nonaktifkan indeks penyimpanan kolom dan gunakan mesin penyimpanan baris (row store engine).
--- Nonaktifkan indeks penyimpanan kolom, gunakan mesin penyimpanan baris, dan atur tingkat paralelisme ke 4. SET polar_csi.enable_query to off; SET max_parallel_workers_per_gather to 4; ---Q1 EXPLAIN ANALYZE SELECT id_1, domain,SUM(consumption) FROM widecolumntable WHERE start_time > '20230101' and end_time < '20240101' GROUP BY id_1, domain Order By SUM(consumption);





