Perintah ALTER TABLE...SPLIT SUBPARTITION menambahkan subpartisi ke tabel yang sudah terpartisi subpartisi.
Ikhtisar
Gunakan perintah ALTER TABLE...SPLIT SUBPARTITION untuk membagi subpartisi menjadi dua dan mendistribusikan ulang isinya. Perintah ini memiliki dua bentuk.
ALTER TABLE nama_tabel SPLIT SUBPARTITION nama_subpartisi
AT (nilai_rentang)
INTO
(
SUBPARTITION subpart_baru1
[TABLESPACE nama_tablespace],
SUBPARTITION subpart_baru2
[TABLESPACE nama_tablespace]
); ALTER TABLE nama_tabel SPLIT SUBPARTITION nama_subpartisi
VALUES (nilai[, nilai]...)
INTO
(
SUBPARTITION subpart_baru1
[TABLESPACE nama_tablespace],
SUBPARTITION subpart_baru2
[TABLESPACE nama_tablespace]
);Deskripsi
Perintah ALTER TABLE...SPLIT SUBPARTITION menambahkan subpartisi baru ke tabel yang telah terpartisi subpartisi. Jumlah subpartisi yang dapat didefinisikan tidak terbatas. Saat menjalankan perintah ini, PolarDB for PostgreSQL (Compatible with Oracle) membuat dua subpartisi baru. Baris dengan nilai yang sesuai dengan aturan subpartisi yang ditentukan dipindahkan ke subpart_baru1, sementara baris lainnya dipindahkan ke subpart_baru2.
Aturan subpartisi baru harus merujuk pada kolom yang digunakan dalam aturan subpartisi yang ada.
Gunakan klausa TABLESPACE untuk menentukan tablespace tempat subpartisi baru akan dibuat. Jika tidak ditentukan, subpartisi akan dibuat di tablespace default.
Jika tabel memiliki indeks, indeks tersebut juga akan dibuat pada subpartisi baru.
Untuk menggunakan perintah ALTER TABLE...SPLIT SUBPARTITION, Anda harus menjadi pemilik tabel atau memiliki hak istimewa superuser (atau administratif).
Parameter
| Parameter | Deskripsi |
| nama_tabel | Nama (opsional kualifikasi skema) dari tabel terpartisi. |
| nama_subpartisi | Nama subpartisi yang akan dibagi. |
| subpart_baru1 | Nama subpartisi pertama yang akan dibuat. Nama subpartisi harus unik di antara semua partisi dan subpartisi, dan harus mengikuti konvensi penamaan untuk pengenal objek.
|
| subpart_baru2 | Nama subpartisi kedua yang akan dibuat. Nama subpartisi harus unik di antara semua partisi dan subpartisi, dan harus mengikuti konvensi penamaan untuk pengenal objek.
|
| (nilai[, nilai]...) | Gunakan Untuk informasi lebih lanjut tentang pembuatan partisi |
| nama_tablespace | Nama tablespace tempat partisi atau subpartisi berada. |
Contoh - membagi subpartisi LIST
Contoh berikut membagi subpartisi daftar dan mendistribusikan ulang isinya ke dua subpartisi baru. Tabel sampel (sales) dibuat menggunakan perintah berikut:
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 first_half_2012 VALUES LESS THAN('01-JUL-2012')
(
SUBPARTITION p1_europe VALUES ('ITALY', 'FRANCE'),
SUBPARTITION p1_americas VALUES ('US', 'CANADA')
),
PARTITION second_half_2012 VALUES LESS THAN('01-JAN-2013')
(
SUBPARTITION p2_europe VALUES ('ITALY', 'FRANCE'),
SUBPARTITION p2_americas VALUES ('US', 'CANADA')
)
);acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
partition_name | subpartition_name | high_value
------------------+-------------------+-------------------
second_half_2012 | p2_europe | 'ITALY', 'FRANCE'
first_half_2012 | p1_europe | 'ITALY', 'FRANCE'
second_half_2012 | p2_americas | 'US', 'CANADA'
first_half_2012 | p1_americas | 'US', 'CANADA'
(4 rows)INSERT INTO sales VALUES
(10, '4519b', 'FRANCE', '17-Jan-2012', '45000'),
(40, '9519b', 'US', '12-Apr-2012', '145000'),
(40, '4577b', 'US', '11-Nov-2012', '25000'),
(30, '7588b', 'CANADA', '14-Dec-2012', '50000'),
(30, '9519b', 'CANADA', '01-Feb-2012', '75000'),
(30, '4519b', 'CANADA', '08-Apr-2012', '120000'),
(40, '3788a', 'US', '12-May-2012', '4950'),
(10, '9519b', 'ITALY', '07-Jul-2012', '15000'),
(10, '9519a', 'FRANCE', '18-Aug-2012', '650000'),
(10, '9519b', 'FRANCE', '18-Aug-2012', '650000'),
(40, '4788a', 'US', '23-Sept-2012', '4950'),
(40, '4788b', 'US', '09-Oct-2012', '15000');acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no | part_no | country| date |amount
-------------------+---------+---------+--------+--------------------+------
sales_p1_europe | 10 | 4519b | FRANCE | 17-JAN-12 00:00:00 | 45000
sales_p1_americas | 40 | 9519b | US | 12-APR-12 00:00:00 | 145000
sales_p1_americas | 30 | 9519b | CANADA | 01-FEB-12 00:00:00 | 75000
sales_p1_americas | 30 | 4519b | CANADA | 08-APR-12 00:00:00 | 120000
sales_p1_americas | 40 | 3788a | US | 12-MAY-12 00:00:00 | 4950
sales_p2_europe | 10 | 9519b | ITALY | 07-JUL-12 00:00:00 | 15000
sales_p2_europe | 10 | 9519a | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_p2_europe | 10 | 9519b | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_p2_americas | 40 | 4577b | US | 11-NOV-12 00:00:00 | 25000
sales_p2_americas | 30 | 7588b | CANADA | 14-DEC-12 00:00:00 | 50000
sales_p2_americas | 40 | 4788a | US | 23-SEP-12 00:00:00 | 4950
sales_p2_americas | 40 | 4788b | US | 09-OCT-12 00:00:00 | 15000
(12 rows)ALTER TABLE sales SPLIT SUBPARTITION p2_americas
VALUES ('US')
INTO
(
SUBPARTITION p2_us,
SUBPARTITION p2_canada
);acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
partition_name | subpartition_name | high_value
------------------+-------------------+-------------------
first_half_2012 | p1_europe | 'ITALY', 'FRANCE'
first_half_2012 | p1_americas | 'US', 'CANADA'
second_half_2012 | p2_europe | 'ITALY', 'FRANCE'
second_half_2012 | p2_canada | 'CANADA'
second_half_2012 | p2_us | 'US'
(5 rows)acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no | part_no | country | date |amount
-------------------+---------+---------+---------+--------------------+------
sales_p1_europe | 10 | 4519b | FRANCE | 17-JAN-12 00:00:00 | 45000
sales_p1_americas | 40 | 9519b | US | 12-APR-12 00:00:00 |145000
sales_p1_americas | 30 | 9519b | CANADA | 01-FEB-12 00:00:00 | 75000
sales_p1_americas | 30 | 4519b | CANADA | 08-APR-12 00:00:00 |120000
sales_p1_americas | 40 | 3788a | US | 12-MAY-12 00:00:00 | 4950
sales_p2_europe | 10 | 9519b | ITALY | 07-JUL-12 00:00:00 | 15000
sales_p2_europe | 10 | 9519a | FRANCE | 18-AUG-12 00:00:00 |650000
sales_p2_europe | 10 | 9519b | FRANCE | 18-AUG-12 00:00:00 |650000
sales_p2_us | 40 | 4577b | US | 11-NOV-12 00:00:00 | 25000
sales_p2_us | 40 | 4788a | US | 23-SEP-12 00:00:00 | 4950
sales_p2_us | 40 | 4788b | US | 09-OCT-12 00:00:00 | 15000
sales_p2_canada | 30 | 7588b | CANADA | 14-DEC-12 00:00:00 | 50000
(12 rows)Contoh - membagi subpartisi RANGE
CREATE TABLE sales
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
amount number
)
PARTITION BY LIST(country)
SUBPARTITION BY RANGE(date)
(
PARTITION europe VALUES('FRANCE', 'ITALY')
(
SUBPARTITION europe_2011
VALUES LESS THAN('2012-Jan-01'),
SUBPARTITION europe_2012
VALUES LESS THAN('2013-Jan-01')
),
PARTITION asia VALUES('INDIA', 'PAKISTAN')
(
SUBPARTITION asia_2011
VALUES LESS THAN('2012-Jan-01'),
SUBPARTITION asia_2012
VALUES LESS THAN('2013-Jan-01')
),
PARTITION americas VALUES('US', 'CANADA')
(
SUBPARTITION americas_2011
VALUES LESS THAN('2012-Jan-01'),
SUBPARTITION americas_2012
VALUES LESS THAN('2013-Jan-01')
)
);acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
partition_name | subpartition_name | high_value
----------------+-------------------+---------------
europe | europe_2011 | '2012-Jan-01'
europe | europe_2012 | '2013-Jan-01'
asia | asia_2011 | '2012-Jan-01'
asia | asia_2012 | '2013-Jan-01'
americas | americas_2011 | '2012-Jan-01'
americas | americas_2012 | '2013-Jan-01'
(6 rows)INSERT INTO sales VALUES
(10, '4519b', 'FRANCE', '17-Jan-2012', '45000'),
(20, '3788a', 'INDIA', '01-Mar-2012', '75000'),
(40, '9519b', 'US', '12-Apr-2012', '145000'),
(20, '3788a', 'PAKISTAN', '04-Jun-2012', '37500'),
(40, '4577b', 'US', '11-Nov-2012', '25000'),
(30, '7588b', 'CANADA', '14-Dec-2012', '50000'),
(30, '9519b', 'CANADA', '01-Feb-2012', '75000'),
(30, '4519b', 'CANADA', '08-Apr-2012', '120000'),
(40, '3788a', 'US', '12-May-2012', '4950'),
(10, '9519b', 'ITALY', '07-Jul-2012', '15000'),
(10, '9519a', 'FRANCE', '18-Aug-2012', '650000'),
(10, '9519b', 'FRANCE', '18-Aug-2012', '650000'),
(20, '3788b', 'INDIA', '21-Sept-2012', '5090'),
(40, '4788a', 'US', '23-Sept-2012', '4950'),
(40, '4788b', 'US', '09-Oct-2012', '15000'),
(20, '4519a', 'INDIA', '18-Oct-2012', '650000'),
(20, '4519b', 'INDIA', '2-Dec-2012', '5090');acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no|part_no| country | date |amount
---------------------+--------+-------+---------+--------------------+---
sales_europe_2012 | 10| 4519b | FRANCE | 17-JAN-12 00:00:00 | 45000
sales_europe_2012 | 10| 9519b | ITALY | 07-JUL-12 00:00:00 | 15000
sales_europe_2012 | 10| 9519a | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_europe_2012 | 10| 9519b | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_asia_2012 | 20| 3788a | INDIA | 01-MAR-12 00:00:00 | 75000
sales_asia_2012 | 20| 3788a | PAKISTAN| 04-JUN-12 00:00:00 | 37500
sales_asia_2012 | 20| 3788b | INDIA | 21-SEP-12 00:00:00 | 5090
sales_asia_2012 | 20| 4519a | INDIA | 18-OCT-12 00:00:00 | 650000
sales_asia_2012 | 20| 4519b | INDIA | 02-DEC-12 00:00:00 | 5090
sales_americas_2012 | 40| 9519b | US | 12-APR-12 00:00:00 | 145000
sales_americas_2012 | 40| 4577b | US | 11-NOV-12 00:00:00 | 25000
sales_americas_2012 | 30| 7588b | CANADA | 14-DEC-12 00:00:00 | 50000
sales_americas_2012 | 30| 9519b | CANADA | 01-FEB-12 00:00:00 | 75000
sales_americas_2012 | 30| 4519b | CANADA | 08-APR-12 00:00:00 | 120000
sales_americas_2012 | 40| 3788a | US | 12-MAY-12 00:00:00 | 4950
sales_americas_2012 | 40| 4788a | US | 23-SEP-12 00:00:00 | 4950
sales_americas_2012 | 40| 4788b | US | 09-OCT-12 00:00:00 | 15000
(17 rows)ALTER TABLE sales
SPLIT SUBPARTITION americas_2012
AT('2012-Jun-01')
INTO
(
SUBPARTITION americas_p1_2012,
SUBPARTITION americas_p2_2012
);acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
partition_name | subpartition_name | high_value
----------------+-------------------+---------------
europe | europe_2012 | '2013-Jan-01'
europe | europe_2011 | '2012-Jan-01'
americas | americas_2011 | '2012-Jan-01'
americas | americas_p2_2012 | '2013-Jan-01'
americas | americas_p1_2012 | '2012-Jun-01'
asia | asia_2012 | '2013-Jan-01'
asia | asia_2011 | '2012-Jan-01'
(7 rows)acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no|part_no|country | date |amount
-----------------------+--------+-------+--------+-------------------+------- sales_europe_2012 | 10| 4519b |FRANCE | 17-JAN-12 00:00:00| 45000
sales_europe_2012 | 10| 9519b |ITALY | 07-JUL-12 00:00:00| 15000
sales_europe_2012 | 10| 9519a |FRANCE | 18-AUG-12 00:00:00| 650000
sales_europe_2012 | 10| 9519b |FRANCE | 18-AUG-12 00:00:00| 650000
sales_asia_2012 | 20| 3788a |INDIA | 01-MAR-12 00:00:00| 75000
sales_asia_2012 | 20| 3788a |PAKISTAN| 04-JUN-12 00:00:00| 37500
sales_asia_2012 | 20| 3788b |INDIA | 21-SEP-12 00:00:00| 5090
sales_asia_2012 | 20| 4519a |INDIA | 18-OCT-12 00:00:00| 650000
sales_asia_2012 | 20| 4519b |INDIA | 02-DEC-12 00:00:00| 5090
sales_americas_p1_2012| 40| 9519b |US | 12-APR-12 00:00:00| 145000
sales_americas_p1_2012| 30| 9519b |CANADA | 01-FEB-12 00:00:00| 75000
sales_americas_p1_2012| 30| 4519b |CANADA | 08-APR-12 00:00:00| 120000
sales_americas_p1_2012| 40| 3788a |US | 12-MAY-12 00:00:00| 4950
sales_americas_p2_2012| 40| 4577b |US | 11-NOV-12 00:00:00| 25000
sales_americas_p2_2012| 30| 7588b |CANADA | 14-DEC-12 00:00:00| 50000
sales_americas_p2_2012| 40| 4788a |US | 23-SEP-12 00:00:00| 4950
sales_americas_p2_2012| 40| 4788b |US | 09-OCT-12 00:00:00| 15000
(17 rows)