Partisi tabel membagi tabel besar menjadi segmen-segmen yang lebih kecil dan dikelola secara independen berdasarkan nilai kolom tertentu. Untuk tabel fakta atau tabel besar, partisi mempercepat penghapusan dan pemuatan data karena Anda dapat mengoperasikan seluruh partisi sekaligus, bukan memindai baris satu per satu.
Hapus semua data dalam suatu partisi dengan
ALTER TABLE DROP PARTITION—jauh lebih cepat daripada menghapus baris satu per satu.Muat batch data baru melalui pertukaran partisi dengan
ALTER TABLE EXCHANGE PARTITION, sehingga menghindari penulisan ke seluruh tabel.
Kapan menggunakan partisi tabel
Sebelum melakukan partisi pada tabel, pastikan hal-hal berikut:
Tabel tersebut besar. Tabel dengan jutaan atau miliaran baris merupakan kandidat ideal. Untuk tabel yang hanya memiliki beberapa ribu baris, overhead administratif biasanya lebih besar daripada keuntungan performanya.
Kueri melakukan filter berdasarkan kolom tertentu. Partisi efektif ketika klausa
WHEREsecara konsisten merujuk kunci partisi, sehingga perencana kueri dapat melewati partisi yang tidak relevan.Anda mengelola data berdasarkan waktu atau kategori. Operasi rutin seperti membersihkan data bulan lalu atau memuat batch harian secara alami sesuai dengan batas partisi.
Jika sebagian besar kueri melakukan pemindaian penuh terhadap tabel tanpa memfilter berdasarkan kunci partisi, partisi justru menambahkan overhead tanpa meningkatkan performa.
Jenis partisi
AnalyticDB for PostgreSQL mendukung tiga jenis partisi:
| Type | When to use |
|---|---|
| Range partitioning | Partisi berdasarkan rentang nilai numerik atau tanggal yang kontinu — misalnya, satu partisi per bulan untuk data time-series. |
| List partitioning | Partisi berdasarkan daftar eksplisit nilai diskrit — misalnya, satu partisi per Wilayah penjualan atau kategori produk. |
| Composite partition | Gabungkan strategi range dan list untuk data multidimensi — misalnya, partisi pertama berdasarkan tahun, lalu berdasarkan Wilayah di dalam setiap tahun. |
Range partitioning hanya mendukung tipe kolom numerik dan tanggal/waktu.
Buat tabel partisi
Contoh berikut membuat tabel LINEITEM yang dipartisi berdasarkan tanggal pengiriman. Setiap partisi mencakup satu bulan kalender dari Januari 1992 hingga Januari 2000.
CREATE TABLE LINEITEM (
L_ORDERKEY BIGINT NOT NULL,
L_PARTKEY BIGINT NOT NULL,
L_SUPPKEY BIGINT NOT NULL,
L_LINENUMBER INTEGER,
L_QUANTITY FLOAT8,
L_EXTENDEDPRICE FLOAT8,
L_DISCOUNT FLOAT8,
L_TAX FLOAT8,
L_RETURNFLAG CHAR(1),
L_LINESTATUS CHAR(1),
L_SHIPDATE DATE,
L_COMMITDATE DATE,
L_RECEIPTDATE DATE,
L_SHIPINSTRUCT CHAR(25),
L_SHIPMODE CHAR(10),
L_COMMENT VARCHAR(44)
) WITH (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576, OIDS=false)
DISTRIBUTED BY (l_orderkey)
PARTITION BY RANGE (L_SHIPDATE)
(START (date '1992-01-01') INCLUSIVE END (date '2000-01-01') EXCLUSIVE EVERY (INTERVAL '1 month'));Parameter utama dalam contoh ini:
| Parameter | Value | Description |
|---|---|---|
ORIENTATION | column | Penyimpanan berorientasi kolom, dioptimalkan untuk kueri analitis |
COMPRESSTYPE | zlib | Kompresi zlib untuk mengurangi jejak penyimpanan |
COMPRESSLEVEL | 5 | Tingkat kompresi (1–9; semakin tinggi = ukuran lebih kecil, penulisan lebih lambat) |
BLOCKSIZE | 1048576 | Ukuran blok dalam byte (1 MB) |
DISTRIBUTED BY | l_orderkey | Kunci distribusi untuk menyebarkan data ke seluruh segmen |
PARTITION BY RANGE | L_SHIPDATE | Kolom partisi — harus bertipe numerik atau tanggal/waktu |
Merawat partisi
Hapus partisi lama
Untuk menghapus semua data dalam suatu partisi, hapus langsung partisinya. Ini jauh lebih cepat daripada pernyataan DELETE karena menghapus penyimpanan partisi tanpa memindai baris satu per satu.
ALTER TABLE LINEITEM DROP PARTITION FOR (date '1992-01-01');Muat data melalui pertukaran partisi
Gunakan perintah ALTER TABLE EXCHANGE PARTITION untuk menambahkan partisi data baru. Ini memungkinkan Anda memuat batch data ke dalam tabel partisi tanpa menulis ke seluruh tabel.
ALTER TABLE LINEITEM EXCHANGE PARTITION FOR (date '1999-12-01')
WITH TABLE lineitem_staging;