Di PostgreSQL, partisi merupakan cara efektif untuk menangani data yang terus bertambah, dan pemangkasan partisi mempercepat kueri. PolarDB for PostgreSQL juga mendukung IMCI pada tabel partisi, sehingga lebih memenuhi kebutuhan statistik dan analitis terhadap data terpartisi.
Latar Belakang
Saat sistem bisnis terus berjalan, data historis terakumulasi dan tabel semakin besar. Praktik umum adalah mempartisi data berdasarkan dimensi seperti waktu atau user_id, sehingga setiap partisi hanya menyimpan sebagian kecil data. Saat Anda melakukan kueri terhadap data tersebut, PostgreSQL asli juga menggunakan pemangkasan partisi untuk menghindari pembacaan data yang tidak relevan.
IMCI di PolarDB for PostgreSQL juga mempercepat kueri analitis pada tabel partisi. Anda menggunakannya dengan cara yang sama seperti menggunakan indeks yang sudah ada pada tabel partisi.
Hasil
Pada tingkat paralelisme 4, IMCI lebih dari 35 kali lebih cepat dibandingkan eksekusi paralel PostgreSQL asli untuk ketiga kueri pengujian.
|
Kueri |
Eksekusi paralel PostgreSQL asli |
IMCI |
|
Q1 |
2,13 s |
0,05 s |
|
Q2 |
6,42 s |
0,18 s |
|
Q3 |
10,51 s |
0,30 s |
Prosedur
Langkah 1: Siapkan lingkungan
-
Verifikasi bahwa versi dan konfigurasi kluster Anda memenuhi persyaratan berikut:
-
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 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.
-
Tabel sumber harus memiliki kunci primer, dan kolom kunci primer harus disertakan saat Anda membuat indeks penyimpanan kolom. Disarankan menggunakan tipe data
SERIALatauBIGSERIALuntuk kunci primer 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:
Langkah 2: Siapkan data
Kasus ini membuat tabel partisi multi-level, memasukkan sekitar 320 juta baris (~16 GB) data simulasi, lalu menjalankan analisis statistik berdasarkan kondisi partisi.
Skema tabel partisi pengujian adalah sebagai berikut:
-
sales: tabel utama. -
sales_2023: dipartisi berdasarkan tahun.-
sales_2023_a: dipartisi berdasarkan bulan; bulan 1 hingga 6 didefinisikan sebagai partisi a. -
sales_2023_b: dipartisi berdasarkan bulan; bulan 7 hingga 12 didefinisikan sebagai partisi b.
-
-
sales_2024: dipartisi berdasarkan tahun.-
sales_2024_a: dipartisi berdasarkan bulan; bulan 1 hingga 6 didefinisikan sebagai partisi a. -
sales_2024_b: dipartisi berdasarkan bulan; bulan 7 hingga 12 didefinisikan sebagai partisi b.
-
-
Buat tabel partisi multi-level bernama
sales, dengan kolom waktusale_datesebagai kunci partisi. Definisinya 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 data dan masukkan ke dalam tabel partisi (sekitar 16 GB).
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 IMCI pada tabel dan sertakan kolom
sale_id,product_id,sale_date, danamountdalam IMCI.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 IMCI.
--- Aktifkan IMCI dan atur tingkat paralelisme kueri ke 4. SET polar_csi.enable_query to on; // Versi kernel tinggi SET polar_csi.max_parallel_workers to 4; // Versi kernel rendah 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;CatatanParameter
polar_csi.max_parallel_workerssebelumnya bernamapolar_csi.exec_parallelpada versi kernel sebelumnya. Untuk versi kernel yang tidak mendukungpolar_csi.max_parallel_workers, gunakanpolar_csi.exec_parallelsebagai gantinya.-
PostgreSQL 14:
-
Gunakan
polar_csi.exec_parallelpada versi 2.0.14.20.42.0 dan sebelumnya. -
Gunakan
polar_csi.max_parallel_workerspada versi 2.0.14.20.43.0 dan seterusnya.
-
-
PostgreSQL 16:
-
Gunakan
polar_csi.exec_parallelpada versi 2.0.16.11.15.0 dan sebelumnya. -
Gunakan
polar_csi.max_parallel_workerspada versi 2.0.16.13.16.0 dan seterusnya.
-
-
-
Nonaktifkan IMCI dan gunakan mesin penyimpanan baris.
--- Nonaktifkan IMCI, gunakan mesin penyimpanan baris, dan atur tingkat paralelisme kueri ke 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;