Di PostgreSQL, tabel partisi merupakan cara efektif untuk mengelola pertumbuhan data, dan pemangkasan partisi membantu mempercepat kueri. Indeks penyimpanan kolom di PolarDB for PostgreSQL juga mendukung tabel partisi guna lebih memenuhi kebutuhan statistik dan analitis dari tabel-tabel tersebut.
Latar Belakang
Saat sistem bisnis berjalan, sistem tersebut menghasilkan sejumlah besar data historis yang menyebabkan ukuran tabel meningkat. Data biasanya dipartisi berdasarkan dimensi seperti waktu atau user_id, dan setiap partisi hanya menyimpan sebagian kecil data. PostgreSQL native juga menggunakan pemangkasan partisi saat menjalankan kueri untuk menghindari pembacaan data yang tidak relevan.
Indeks penyimpanan kolom di PolarDB for PostgreSQL juga mendukung akselerasi analitik pada tabel partisi. Anda dapat menggunakannya dengan cara yang sama seperti indeks yang sudah ada pada tabel partisi.
Hasil
Dengan tingkat paralelisme 4, indeks penyimpanan kolom berjalan lebih dari 35 kali lebih cepat dibandingkan eksekusi paralel PostgreSQL native untuk ketiga kueri tersebut.
Kueri | Eksekusi paralel PostgreSQL native | Columnstore Index |
Q1 | 2,13 dtk | 0,05 dtk |
Q2 | 6,42 dtk | 0,18 dtk |
Q3 | 10,51 dtk | 0,30 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 sesuai dan lanjutkan dengan hati-hati.
Aktifkan fitur indeks penyimpanan kolom.
Metode untuk mengaktifkan fitur indeks penyimpanan kolom bervariasi tergantung pada versi mesin minor kluster PolarDB for PostgreSQL Anda:
Langkah 2: Siapkan data
Pada contoh ini, Anda akan membuat tabel partisi multi-level dan memasukkan 320 juta baris data simulasi (sekitar 16 GB). Kemudian, Anda akan melakukan analisis statistik berdasarkan kondisi partisi.
Skema tabel partisi uji adalah sebagai berikut:
sales: Tabel utama.sales_2023: Dipartisi berdasarkan tahun.sales_2023_a: Dipartisi berdasarkan bulan. Partisi ini berisi data untuk bulan 1 hingga 6.sales_2023_b: Dipartisi berdasarkan bulan. Partisi ini berisi data untuk bulan 7 hingga 12.
sales_2024: Dipartisi berdasarkan tahun.sales_2024_a: Dipartisi berdasarkan bulan. Partisi ini berisi data untuk bulan 1 hingga 6.sales_2024_b: Dipartisi berdasarkan bulan. Partisi ini berisi data untuk bulan 7 hingga 12.
Buat tabel partisi multi-level bernama
sales. Gunakan kolomsale_datesebagai kunci partisi. Definisinya adalah sebagai berikut.CREATE TABLE sales ( sale_id serial, product_id int NOT NULL, sale_date date NOT NULL, amount numeric(10,2) NOT NULL, primary key(sale_id, sale_date) ) PARTITION BY RANGE (sale_date); CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-1-1') TO ('2024-1-1') PARTITION BY RANGE (sale_date); CREATE TABLE sales_2023_a PARTITION OF sales_2023 FOR VALUES FROM ('2023-1-1') TO ('2023-7-1'); CREATE TABLE sales_2023_b PARTITION OF sales_2023 FOR VALUES FROM ('2023-7-1') TO ('2024-1-1'); CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-1-1') TO ('2025-1-1') PARTITION BY RANGE (sale_date); CREATE TABLE sales_2024_a PARTITION OF sales_2024 FOR VALUES FROM ('2024-1-1') TO ('2024-7-1'); CREATE TABLE sales_2024_b PARTITION OF sales_2024 FOR VALUES FROM ('2024-7-1') TO ('2025-1-1');Hasilkan dan masukkan sekitar 16 GB data ke dalam tabel partisi.
INSERT INTO sales (product_id, sale_date, amount) SELECT (random()*100)::int AS product_id, '2023-01-1'::date + i/3200000*7 AS sale_date, (random()*1000)::numeric(10,2) AS amount FROM generate_series(1, 320000000) i;Buat indeks penyimpanan kolom untuk tabel tersebut. Tambahkan bidang
sale_id,product_id,sale_date, danamountke dalam indeks penyimpanan kolom.CREATE INDEX ON sales USING CSI(sale_id, product_id, sale_date, amount);
Langkah 3: Jalankan kueri
Jalankan kueri menggunakan mesin eksekusi yang berbeda. Tiga kueri, Q1, Q2, dan Q3, dibuat berdasarkan kondisi partisi yang berbeda.
Gunakan indeks penyimpanan kolom
--- Aktifkan indeks penyimpanan kolom dan atur tingkat paralelisme kueri menjadi 4. SET polar_csi.enable_query to on; SET polar_csi.exec_parallel to 4; --- Q1 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2023-3-1' AND amount > 100 GROUP BY sale_date; --- Q2 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2023-9-1' AND amount > 100 GROUP BY sale_date; --- Q3 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2024-3-1' AND amount > 100 GROUP BY sale_date;Nonaktifkan indeks penyimpanan kolom dan gunakan mesin penyimpanan baris
--- Nonaktifkan indeks penyimpanan kolom, gunakan mesin penyimpanan baris, dan atur tingkat paralelisme kueri menjadi 4. SET polar_csi.enable_query to off; SET max_parallel_workers_per_gather to 4; --- Q1 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2023-3-1' AND amount > 100 GROUP BY sale_date; --- Q2 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2023-9-1' AND amount > 100 GROUP BY sale_date; --- Q3 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2024-3-1' AND amount > 100 GROUP BY sale_date;





