全部产品
Search
文档中心

PolarDB:ALTER TABLE...MERGE SUBPARTITION

更新时间:Jul 02, 2025

Anda dapat menggunakan perintah ALTER TABLE...MERGE SUBPARTITION untuk menggabungkan dua subpartisi menjadi satu subpartisi baru yang berisi semua data dari kedua subpartisi asli.

Catatan
  • Anda harus menjadi pemilik tabel atau memiliki izin administratif pada tabel untuk menjalankan pernyataan ini.
  • Perintah SQL ini hanya dapat digunakan pada tabel terpartisi LIST dan tabel terpartisi RANGE. Tidak dapat digunakan pada tabel terpartisi HASH.
  • Jika indeks ada pada tabel, indeks akan dibuat ulang pada partisi baru.

Sintaksis

ALTER TABLE nama_tabel MERGE SUBPARTITIONS
        nama_partisi , nama_partisi 
        INTO SUBPARTITION  new_part [TABLESPACE nama_tablespace] ;

Parameter

ParameterDeskripsi
nama_tabelNama tabel terpartisi. Anda dapat menentukan skema.
nama_partisiNama dari dua subpartisi yang akan digabungkan. Pisahkan nama dengan koma (,).
new_partNama dari subpartisi baru.

Nama partisi harus unik di antara semua partisi dan subpartisi.

nama_tablespaceMenentukan tablespace tempat subpartisi baru berada.

Jika Anda tidak menentukan tablespace, subpartisi akan berada di tablespace default.

Contoh

Buat tabel terpartisi bernama sales dan masukkan data uji ke dalam tabel. Contoh:

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')
    )
);
SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS where table_name = 'SALES';
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');
SELECT tableoid::regclass, * FROM sales;

Pisahkan subpartisi americas_2012 menjadi dua subpartisi: americas_p1_2012 dan americas_p2_2012. Contoh:

ALTER TABLE sales 
  SPLIT SUBPARTITION americas_2012 
  AT('2012-Jun-01')
  INTO
  (
    SUBPARTITION americas_p1_2012, 
    SUBPARTITION americas_p2_2012
  );

Gabungkan subpartisi americas_p1_2012 dan americas_p2_2012 menjadi subpartisi baru new_americas_2012. Contoh:

ALTER TABLE sales 
  MERGE SUBPARTITIONS americas_p1_2012 ,americas_p2_2012
  INTO  SUBPARTITION new_americas_2012;