AnalyticDB for PostgreSQL memungkinkan Anda membagi tabel besar menjadi beberapa partisi. Saat menggunakan kondisi untuk menanyakan data, sistem hanya memindai partisi yang sesuai dengan kondisi tertentu, sehingga mencegah pemindaian seluruh tabel dan meningkatkan kinerja query.
Jenis partisi yang didukung
Partisi Rentang: Data dibagi berdasarkan rentang numerik, seperti tanggal.
Partisi Daftar: Data dibagi berdasarkan daftar nilai, seperti atribut kota.
Partisi Multi-level: Data dibagi berdasarkan rentang numerik dan daftar nilai.
Membuat tabel partisi rentang
Anda dapat membuat AnalyticDB for PostgreSQL menghasilkan partisi secara otomatis dengan menentukan nilai START, nilai END, dan klausa EVERY yang mendefinisikan interval dalam rentang. Secara default, nilai START bersifat inklusif dan nilai END bersifat eksklusif.
Berikut adalah contoh pembuatan tabel yang dipartisi berdasarkan rentang tanggal:
CREATE TABLE sales (id int, date date, amt decimal(10,2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
( START (date '2016-01-01') INCLUSIVE
END (date '2017-01-01') EXCLUSIVE
EVERY (INTERVAL '1 day') );Contoh pembuatan tabel yang dipartisi berdasarkan angka, dengan kolom tipe data INT sebagai kunci partisi:
CREATE TABLE rank (id int, rank int, year int, gender char(1), count int)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
( START (2006) END (2016) EVERY (1),
DEFAULT PARTITION extra ); Membuat tabel partisi daftar
Saat membuat tabel partisi daftar, Anda dapat menetapkan kunci partisi ke kolom apa pun yang tipe datanya mendukung perbandingan nilai. Anda juga harus mendeklarasikan deskripsi untuk setiap nilai yang ditentukan dari kunci partisi.
Berikut adalah contoh pembuatan tabel partisi daftar:
CREATE TABLE rank (id int, rank int, year int, gender
char(1), count int )
DISTRIBUTED BY (id)
PARTITION BY LIST (gender)
( PARTITION girls VALUES ('F'),
PARTITION boys VALUES ('M'),
DEFAULT PARTITION other );Membuat tabel partisi multi-level
AnalyticDB for PostgreSQL memungkinkan Anda membuat tabel dengan partisi multi-level. Contoh berikut menunjukkan cara membuat tabel partisi tiga level. Data di partisi level-1 dipartisi berdasarkan rentang tahun, data di partisi level-2 dipartisi berdasarkan rentang bulan, dan data di partisi level-3 dipartisi berdasarkan daftar wilayah. Partisi level-2 dan level-3 disebut subpartisi.
CREATE TABLE sales (id int, year int, month int, day int,
region text)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
SUBPARTITION BY RANGE (month)
SUBPARTITION TEMPLATE (
START (1) END (13) EVERY (1),
DEFAULT SUBPARTITION other_months )
SUBPARTITION BY LIST (region)
SUBPARTITION TEMPLATE (
SUBPARTITION usa VALUES ('usa'),
SUBPARTITION europe VALUES ('europe'),
SUBPARTITION asia VALUES ('asia'),
DEFAULT SUBPARTITION other_regions )
( START (2002) END (2012) EVERY (1),
DEFAULT PARTITION outlying_years );Menambahkan partisi
Anda dapat menjalankan pernyataan ALTER TABLE untuk menambahkan partisi ke tabel terpartisi. Jika template subpartisi digunakan saat tabel terpartisi dibuat, partisi yang ditambahkan juga akan dipartisi sesuai. Berikut adalah contoh penambahan partisi:
ALTER TABLE sales ADD PARTITION
START (date '2017-02-01') INCLUSIVE
END (date '2017-03-01') EXCLUSIVE;Jika tidak ada template subpartisi yang digunakan saat tabel terpartisi dibuat, Anda dapat mendefinisikan subpartisi saat menambahkan partisi. Berikut adalah contohnya:
ALTER TABLE sales ADD PARTITION
START (date '2017-02-01') INCLUSIVE
END (date '2017-03-01') EXCLUSIVE
( SUBPARTITION usa VALUES ('usa'),
SUBPARTITION asia VALUES ('asia'),
SUBPARTITION europe VALUES ('europe') );Anda juga dapat menggunakan pernyataan ALTER TABLE untuk mensubpartisi partisi yang sudah ada:
ALTER TABLE sales ALTER PARTITION FOR (RANK(12))
ADD PARTITION africa VALUES ('africa');Partisi tidak dapat ditambahkan ke tabel terpartisi yang memiliki partisi default. Untuk menambahkan partisi ke tabel tersebut, Anda dapat membagi partisi default. Untuk informasi lebih lanjut, lihat bagian "Membagi Partisi".
Menentukan nama untuk partisi
Saat membuat tabel terpartisi, Anda dapat menentukan nama untuk partisi mulai dari AnalyticDB for PostgreSQL V6.3.10.9 dengan menggunakan klausa WITH(tablename=<tablename_1>).
Berikut adalah contoh pernyataan:
CREATE TABLE partition_with_name_list (a int, b int, c int) DISTRIBUTED BY (a) PARTITION BY LIST (a)
(
PARTITION p1 VALUES (1) WITH (tablename='partition_with_name_list_p1'),
PARTITION p2 VALUES (2) WITH (tablename='partition_with_name_list_p2'),
PARTITION p3 VALUES (3) WITH (tablename='partition_with_name_list_p3'),
PARTITION p4 VALUES (4) WITH (tablename='partition_with_name_list_p4')
);Membagi partisi
Anda dapat menjalankan pernyataan ALTER TABLE untuk membagi partisi menjadi dua partisi. Pembagian partisi tunduk pada batasan berikut:
Jika subpartisi ada, hanya tingkat terendah dari subpartisi yang dapat dibagi.
Nilai pembagian yang ditentukan dalam klausa AT dari pernyataan pembagian partisi diberikan ke partisi kedua.
Sebagai contoh, asumsikan bahwa partisi yang berisi data Januari 2017 dibagi menjadi dua partisi. Partisi pertama berisi data dari 1 hingga 15 Januari dan partisi kedua berisi data dari 16 hingga 31 Januari:
ALTER TABLE sales SPLIT PARTITION FOR ('2017-01-01')
AT ('2017-01-16')
INTO (PARTITION jan171to15, PARTITION jan1716to31);Jika tabel terpartisi Anda memiliki partisi default, Anda dapat menambahkan partisi dengan membagi partisi default. Dalam klausa INTO, Anda harus menentukan partisi default sebagai partisi kedua:
ALTER TABLE sales SPLIT DEFAULT PARTITION
START ('2017-01-01') INCLUSIVE
END ('2017-02-01') EXCLUSIVE
INTO (PARTITION jan17, default partition);Menentukan granularitas partisi
Saat menggunakan tabel terpartisi, Anda mungkin perlu menentukan granularitas partisi. Sebagai contoh, untuk mempartisi tabel berdasarkan waktu, Anda dapat memilih granularitas hari, minggu, atau bulan. Granularitas yang lebih halus menghasilkan lebih sedikit data di setiap partisi tetapi jumlah partisi yang lebih besar. Jumlah partisi tidak diukur dengan standar absolut. Kami merekomendasikan agar Anda menetapkan tidak lebih dari 200 partisi di setiap tabel. Jumlah partisi yang besar dapat mengurangi kinerja database. Sebagai contoh, pengoptimal query membutuhkan waktu lama untuk menghasilkan rencana eksekusi atau operasi VACUUM membutuhkan waktu lama untuk selesai.
Mengoptimalkan query tabel terpartisi
AnalyticDB for PostgreSQL mendukung pemangkasan partisi untuk tabel terpartisi guna meningkatkan kinerja query. Saat pemangkasan partisi diaktifkan, sistem hanya memindai partisi yang diperlukan berdasarkan kondisi query, bukan memindai seluruh tabel. Contoh:
EXPLAIN
SELECT * FROM sales
WHERE year = 2008
AND month = 1
AND day = 3
AND region = 'usa';Dalam contoh di atas, kondisi query jatuh pada partisi level-3 usa di partisi level-2 1 di partisi level-1 2008. Oleh karena itu, hanya data di partisi level-3 usa yang dipindai selama query. Rencana eksekusi berikut menunjukkan bahwa hanya satu dari 468 partisi level-3 yang perlu dipindai:
Gather Motion 4:1 (slice1; segments: 4) (cost=0.00..431.00 rows=1 width=24)
-> Sequence (cost=0.00..431.00 rows=1 width=24)
-> Partition Selector for sales (dynamic scan id: 1) (cost=10.00..100.00 rows=25 width=4)
Filter: year = 2008 AND month = 1 AND region = 'usa'::text
Partitions selected: 1 (out of 468)
-> Dynamic Table Scan on sales (dynamic scan id: 1) (cost=0.00..431.00 rows=1 width=24)
Filter: year = 2008 AND month = 1 AND day = 3 AND region = 'usa'::textMeminta definisi partisi
Anda dapat menjalankan pernyataan SQL berikut untuk meminta definisi semua partisi dalam tabel:
SELECT
partitionboundary,
partitiontablename,
partitionname,
partitionlevel,
partitionrank
FROM pg_partitions
WHERE tablename='sales';Memelihara tabel terpartisi
Anda dapat mengelola partisi dalam tabel terpartisi. Sebagai contoh, Anda dapat menambahkan, menghapus, mengganti nama, memotong, menukar, dan membagi partisi. Untuk informasi lebih lanjut, lihat Pemartisian Tabel Besar.
Mengganti nama partisi
Anda dapat mengganti nama partisi mulai dari AnalyticDB for PostgreSQL V6.3.10.9.
Contoh pernyataan untuk mengubah nama partisi dari partition_with_name_list_p1 menjadi partition_with_name_list_p1r:
ALTER TABLE partition_with_name_list_p1 RENAME TO partition_with_name_list_p1r;FAQ
T: Bagaimana cara menentukan kunci partisi untuk tabel?
A: Jika tabel Anda memiliki kunci utama, Anda harus menentukan kolom kunci utama sebagai kunci partisi. Jika tabel Anda tidak memiliki kunci utama, Anda dapat menentukan kolom apa pun sebagai kunci partisi.