全部产品
Search
文档中心

PolarDB:ALTER TABLE...SPLIT SUBPARTITION

更新时间:Jul 02, 2025

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.

Bentuk pertama membagi subpartisi rentang menjadi dua subpartisi:
ALTER TABLE nama_tabel SPLIT SUBPARTITION nama_subpartisi
  AT (nilai_rentang)
  INTO 
  (
    SUBPARTITION subpart_baru1 
      [TABLESPACE nama_tablespace],
    SUBPARTITION subpart_baru2 
      [TABLESPACE nama_tablespace]
  ); 
Bentuk kedua membagi subpartisi daftar menjadi dua subpartisi:
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

ParameterDeskripsi
nama_tabelNama (opsional kualifikasi skema) dari tabel terpartisi.
nama_subpartisiNama 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_baru1 akan menerima baris yang memenuhi batasan subpartisi yang ditentukan dalam perintah ALTER TABLE...SPLIT SUBPARTITION.

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.

subpart_baru2 akan menerima baris yang tidak diarahkan ke subpart_baru1 oleh batasan subpartisi yang ditentukan dalam perintah ALTER TABLE... SPLIT SUBPARTITION.

(nilai[, nilai]...)

Gunakan nilai untuk menentukan nilai literal yang dikutip (atau daftar nilai literal yang dipisahkan koma) berdasarkan mana entri tabel akan dikelompokkan ke dalam partisi. Setiap aturan partisi harus menentukan setidaknya satu nilai, tetapi jumlah nilai yang ditentukan dalam suatu aturan tidak terbatas. nilai bisa berupa null, default (jika menentukan subpartisi LIST), atau maxvalue (jika menentukan subpartisi RANGE).

Untuk informasi lebih lanjut tentang pembuatan partisi DEFAULT atau MAXVALUE, lihat Menangani nilai liar dalam tabel terpartisi daftar atau rentang.

nama_tablespaceNama 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')
    )
  );
Tabel sales memiliki dua partisi, yaitu first_half_2012 dan second_half_2012. Setiap partisi memiliki dua subpartisi yang didefinisikan berdasarkan rentang, yang mendistribusikan isi partisi berdasarkan nilai kolom country.
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)
Perintah berikut menambahkan baris ke setiap subpartisi:
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');
Pernyataan SELECT digunakan untuk memastikan bahwa baris didistribusikan sesuai harapan:
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)
Perintah berikut membagi subpartisi p2_americas menjadi dua subpartisi baru dan mendistribusikan ulang isinya:
ALTER TABLE sales SPLIT SUBPARTITION p2_americas
  VALUES ('US') 
  INTO 
  (
    SUBPARTITION p2_us,
    SUBPARTITION p2_canada
  );
Setelah perintah ini dijalankan, subpartisi p2_americas dihapus dan digantikan oleh dua subpartisi baru (p2_us dan 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)
Interogasi tabel sales menunjukkan bahwa isi subpartisi p2_americas telah didistribusikan ulang:
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

Contoh berikut membagi subpartisi rentang 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 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')
    )
);
Tabel sales memiliki tiga partisi (europe, asia, dan americas). Setiap partisi memiliki dua subpartisi yang didefinisikan berdasarkan rentang, yang mendistribusikan isi partisi berdasarkan nilai kolom date.
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)
Perintah berikut menambahkan baris ke setiap subpartisi:
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');
Pernyataan SELECT digunakan untuk memastikan bahwa baris didistribusikan sesuai harapan:
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)
Perintah berikut membagi subpartisi americas_2012 menjadi dua subpartisi baru dan mendistribusikan ulang isinya:
ALTER TABLE sales 
  SPLIT SUBPARTITION americas_2012 
  AT('2012-Jun-01')
  INTO
  (
    SUBPARTITION americas_p1_2012, 
    SUBPARTITION americas_p2_2012
  );
Setelah perintah ini dijalankan, subpartisi americas_2012 dihapus dan digantikan oleh dua subpartisi baru (americas_p1_2012 dan 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)
Interogasi tabel sales menunjukkan bahwa isi subpartisi americas_2012 telah didistribusikan ulang:
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)