Anda dapat menggunakan klausa PARTITION BY dari pernyataan CREATE TABLE untuk membuat tabel terpartisi. Data dalam tabel ini didistribusikan di antara satu atau lebih partisi (dan subpartisi).
Sintaksis
Pernyataan CREATE TABLE memiliki tiga bentuk berikut:
Sintaksis partisi daftar
Bentuk pertama digunakan untuk membuat tabel terpartisi daftar:
CREATE TABLE [ schema. ]table_name table_definition PARTITION BY LIST(column) [SUBPARTITION BY {RANGE|LIST|HASH} (column[, column ]...)] (list_partition_definition[, list_partition_definition]...);list_partition_definition adalah:
PARTITION [partition_name] VALUES (value[, value]...) [TABLESPACE tablespace_name] [(subpartition, ...)]Sintaksis partisi rentang
Bentuk kedua digunakan untuk membuat tabel terpartisi rentang:
CREATE TABLE [ schema. ]table_name table_definition PARTITION BY RANGE(column[, column ]...) [SUBPARTITION BY {RANGE|LIST|HASH} (column[, column ]...)] (range_partition_definition[, range_partition_definition]...);range_partition_definition adalah:
PARTITION [partition_name] VALUES LESS THAN (value[, value]...) [TABLESPACE tablespace_name] [(subpartition, ...)]Sintaksis subpartisi
Subpartisi dapat berupa salah satu dari dua jenis berikut:
{list_subpartition | range_subpartition}list_subpartition adalah:
SUBPARTITION [subpartition_name] VALUES (value[, value]...) [TABLESPACE tablespace_name]range_subpartition adalah:
SUBPARTITION [subpartition_name] VALUES LESS THAN (value[, value]...) [TABLESPACE tablespace_name]
Ikhtisar
Pernyataan CREATE TABLE... PARTITION BY membuat tabel dengan satu atau beberapa partisi. Setiap partisi dapat memiliki satu atau lebih subpartisi. Jumlah partisi yang didefinisikan tidak terbatas. Jika Anda menyertakan klausa PARTITION BY, minimal satu aturan partisi harus ditentukan. Tabel yang dihasilkan dimiliki oleh pengguna yang membuatnya.
Gunakan klausa PARTITION BY LIST untuk membagi tabel menjadi partisi berdasarkan nilai dalam kolom tertentu. Setiap aturan partisi harus menentukan minimal satu nilai literal. Jumlah nilai yang dapat ditentukan tidak terbatas. Sertakan aturan dengan nilai DEFAULT untuk mengarahkan baris yang tidak memenuhi syarat ke partisi tertentu.
Gunakan klausa PARTITION BY RANGE untuk menentukan aturan batas pembuatan partisi. Setiap aturan partisi harus mencakup setidaknya satu kolom dengan tipe data yang mendukung dua operator (misalnya, operator lebih besar dari atau sama dengan dan operator kurang dari). Batas rentang dievaluasi berdasarkan klausa LESS THAN dan bersifat non-inclusive. Batas tanggal 1 Januari 2013 hanya mencakup nilai tanggal hingga 31 Desember 2012.
Aturan partisi rentang harus ditentukan dalam urutan menaik. Jika pernyataan INSERT menyimpan baris dengan nilai melebihi batas atas tabel terpartisi rentang, pernyataan tersebut akan gagal. Namun, pernyataan tidak akan gagal jika aturan partisi mencakup batas dengan nilai MAXVALUE. Jika aturan MAXVALUE tidak disertakan, baris yang melebihi batas maksimum akan menyebabkan kesalahan.
Gunakan kata kunci TABLESPACE untuk menentukan nama tablespace tempat partisi atau subpartisi akan dibuat. Jika tidak ditentukan, partisi atau subpartisi akan dibuat di tablespace default.
Jika sintaksis CREATE TABLE digunakan untuk membuat indeks pada tabel terpartisi, indeks akan dibuat pada setiap partisi atau subpartisi.
Jika definisi tabel mencakup klausa SUBPARTITION BY, setiap partisi dalam tabel akan memiliki minimal satu subpartisi. Subpartisi dapat didefinisikan secara eksplisit atau ditentukan oleh sistem.
Jika subpartisi ditentukan oleh sistem, subpartisi yang dihasilkan server akan berada di tablespace default, dan nama subpartisi akan ditetapkan oleh server. Server akan membuat:
Subpartisi DEFAULT jika klausa SUBPARTITION BY menentukan LIST.
Subpartisi MAXVALUE jika klausa SUBPARTITION BY menentukan RANGE.
Nama subpartisi yang dihasilkan server merupakan kombinasi dari nama partisi dan pengenal unik. Anda dapat memeriksa tabel ALL_TAB_SUBPARTITIONS untuk melihat daftar lengkap nama subpartisi.
Parameter
Parameter | Deskripsi |
table_name | Nama (opsional memenuhi skema) dari tabel yang akan dibuat. |
table_definition | Nama kolom, tipe data, dan informasi kendala seperti yang dijelaskan dalam dokumentasi inti PostgreSQL untuk pernyataan |
partition_name | Nama partisi yang akan dibuat. Nama partisi harus unik di antara semua partisi dan subpartisi, dan harus mengikuti konvensi penamaan untuk pengenal objek. |
subpartition_name | Nama subpartisi yang akan dibuat. Nama subpartisi harus unik di antara semua partisi dan subpartisi, dan harus mengikuti konvensi penamaan untuk pengenal objek. |
column | Nama kolom tempat aturan partisi didasarkan. Setiap baris akan disimpan dalam partisi yang sesuai dengan nilai kolom yang ditentukan. |
(value[, value]...) | Gunakan Ketika Anda menentukan aturan untuk tabel terpartisi daftar, sertakan kata kunci Ketika Anda menentukan aturan untuk tabel terpartisi rentang, sertakan kata kunci |
tablespace_name | Nama tablespace tempat partisi atau subpartisi berada. |
Contoh - PARTITION BY LIST
Contoh berikut menggunakan klausa PARTITION BY LIST untuk membuat tabel terpartisi bernama sales. Tabel sales menyimpan informasi dalam tiga partisi (europe, asia, dan americas):
CREATE TABLE sales
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
amount number
)
PARTITION BY LIST(country)
(
PARTITION europe VALUES('FRANCE', 'ITALY'),
PARTITION asia VALUES('INDIA', 'PAKISTAN'),
PARTITION americas VALUES('US', 'CANADA')
);Tabel yang dihasilkan dipartisi berdasarkan nilai dalam kolom country:
acctg=# SELECT partition_name, high_value from ALL_TAB_PARTITIONS;
partition_name | high_value
----------------+---------------------
americas | 'US', 'CANADA'
asia | 'INDIA', 'PAKISTAN'
europe | 'FRANCE', 'ITALY'
(3 rows)Baris dengan nilai US atau CANADA dalam kolom country disimpan dalam partisi americas.
Baris dengan nilai INDIA atau PAKISTAN dalam kolom country disimpan dalam partisi asia.
Baris dengan nilai FRANCE atau ITALY dalam kolom country disimpan dalam partisi europe.
Server mengevaluasi pernyataan berikut berdasarkan aturan partisi dan menyimpan baris dalam partisi europe:
INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');Contoh - PARTITION BY RANGE
Contoh berikut menggunakan klausa PARTITION BY RANGE untuk membuat tabel terpartisi bernama sales. Tabel sales menyimpan informasi dalam empat partisi (q1_2012, q2_2012, q3_2012, dan q4_2012).
CREATE TABLE sales
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
amount number
)
PARTITION BY RANGE(date)
(
PARTITION q1_2012
VALUES LESS THAN('2012-Apr-01'),
PARTITION q2_2012
VALUES LESS THAN('2012-Jul-01'),
PARTITION q3_2012
VALUES LESS THAN('2012-Oct-01'),
PARTITION q4_2012
VALUES LESS THAN('2013-Jan-01')
);Tabel yang dihasilkan dipartisi berdasarkan nilai dalam kolom date:
SELECT partition_name, high_value from ALL_TAB_PARTITIONS;
partition_name | high_value
----------------+------------------------------------------------------------------
q1_2012 | FOR VALUES FROM (MINVALUE) TO ('01-APR-12 00:00:00')
q2_2012 | FOR VALUES FROM ('01-APR-12 00:00:00') TO ('01-JUL-12 00:00:00')
q3_2012 | FOR VALUES FROM ('01-JUL-12 00:00:00') TO ('01-OCT-12 00:00:00')
q4_2012 | FOR VALUES FROM ('01-OCT-12 00:00:00') TO ('01-JAN-13 00:00:00')
(4 rows)Baris dengan nilai dalam kolom date sebelum 1 April 2012 disimpan dalam partisi q1_2012.
Baris dengan nilai dalam kolom date sebelum 1 Juli 2012 disimpan dalam partisi q2_2012.
Baris dengan nilai dalam kolom date sebelum 1 Oktober 2012 disimpan dalam partisi q3_2012.
Baris dengan nilai dalam kolom date sebelum 1 Januari 2013 disimpan dalam partisi q4_2012.
Server mengevaluasi pernyataan berikut berdasarkan aturan partisi dan menyimpan baris dalam partisi q3_2012:
INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');Contoh - PARTITION BY RANGE, SUBPARTITION BY LIST
Contoh berikut membuat tabel terpartisi (sales) yang pertama kali dipartisi menggunakan tanggal transaksi. Kemudian, partisi rentang (q1_2012, q2_2012, q3_2012, dan q4_2012) dipartisi daftar menggunakan nilai kolom country.
CREATE TABLE sales
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
amount number
)
PARTITION BY RANGE(date)
SUBPARTITION BY LIST(country)
(
PARTITION q1_2012
VALUES LESS THAN('2012-Apr-01')
(
SUBPARTITION q1_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q1_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q1_americas VALUES ('US', 'CANADA')
),
PARTITION q2_2012
VALUES LESS THAN('2012-Jul-01')
(
SUBPARTITION q2_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q2_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q2_americas VALUES ('US', 'CANADA')
),
PARTITION q3_2012
VALUES LESS THAN('2012-Oct-01')
(
SUBPARTITION q3_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q3_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q3_americas VALUES ('US', 'CANADA')
),
PARTITION q4_2012
VALUES LESS THAN('2013-Jan-01')
(
SUBPARTITION q4_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q4_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q4_americas VALUES ('US', 'CANADA')
)
);Tabel yang dibuat menggunakan pernyataan ini memiliki empat partisi. Setiap partisi memiliki tiga subpartisi:
SELECT subpartition_name, high_value, partition_name FROM ALL_TAB_SUBPARTITIONS;
subpartition_name | high_value | partition_name
-------------------+-------------------------------------+----------------
q1_americas | FOR VALUES IN ('US', 'CANADA') | q1_2012
q1_asia | FOR VALUES IN ('INDIA', 'PAKISTAN') | q1_2012
q1_europe | FOR VALUES IN ('FRANCE', 'ITALY') | q1_2012
q2_americas | FOR VALUES IN ('US', 'CANADA') | q2_2012
q2_asia | FOR VALUES IN ('INDIA', 'PAKISTAN') | q2_2012
q2_europe | FOR VALUES IN ('FRANCE', 'ITALY') | q2_2012
q3_americas | FOR VALUES IN ('US', 'CANADA') | q3_2012
q3_asia | FOR VALUES IN ('INDIA', 'PAKISTAN') | q3_2012
q3_europe | FOR VALUES IN ('FRANCE', 'ITALY') | q3_2012
q4_americas | FOR VALUES IN ('US', 'CANADA') | q4_2012
q4_asia | FOR VALUES IN ('INDIA', 'PAKISTAN') | q4_2012
q4_europe | FOR VALUES IN ('FRANCE', 'ITALY') | q4_2012
(12 rows)Ketika baris ditambahkan ke tabel ini, nilai dalam kolom date dibandingkan dengan nilai yang ditentukan dalam aturan partisi rentang. Server memilih partisi tempat baris tersebut akan berada. Nilai dalam kolom country kemudian dibandingkan dengan nilai yang ditentukan dalam aturan subpartisi daftar. Ketika server menemukan kecocokan untuk nilai tersebut, baris disimpan dalam subpartisi yang sesuai.
Setiap baris yang ditambahkan ke tabel disimpan dalam subpartisi. Oleh karena itu, semua partisi tidak berisi data.
Server mengevaluasi pernyataan berikut berdasarkan aturan partisi dan subpartisi dan menyimpan baris dalam partisi q3_europe:
INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');