全部产品
Search
文档中心

PolarDB:ALTER TABLE SPLIT PARTITION

更新时间:Oct 24, 2025

Membagi partisi rentang (RANGE) atau daftar (LIST) menjadi dua partisi baru. Operasi ini mengatur ulang data dan tidak dapat dibatalkan. Sebelum menjalankan perintah ini, rencanakan batas serta nama partisi baru, dan cadangkan data Anda.

Sinopsis

-- Membagi partisi RANGE
ALTER TABLE table_name SPLIT PARTITION partition_name
  AT (range_part_value)
  INTO 
  (
    PARTITION new_part1 
      [TABLESPACE tablespace_name],
    PARTITION new_part2 
      [TABLESPACE tablespace_name]
  ); 

-- Membagi partisi LIST
ALTER TABLE table_name SPLIT PARTITION partition_name
  VALUES (value[, value]...) 
  INTO 
  (
    PARTITION new_part1 
      [TABLESPACE tablespace_name],
    PARTITION new_part2 
      [TABLESPACE tablespace_name]
  );

Parameter

Parameter

Diperlukan

Deskripsi

Contoh

table_name

Ya

Nama tabel partisi target.

log_archives

partition_name

Ya

Nama partisi yang ada untuk dibagi.

p_2022

AT (range_part_value)

Untuk membagi partisi RANGE

Menentukan titik pemisahan untuk partisi RANGE. Nilai ini menjadi batas bawah dari partisi kedua yang baru.

AT (TO_DATE('2022-07-01', 'YYYY-MM-DD'))

VALUES (value[, value]...)

Untuk membagi partisi LIST

Menentukan daftar nilai untuk ditetapkan ke partisi pertama yang baru saat membagi partisi LIST.

VALUES ('China', 'Singapore')

INTO (...)

Ya

Menentukan nama dari dua partisi baru dan ruang tabel opsional. new_part1 berisi data sebelum titik pemisahan, dan new_part2 berisi data setelah titik pemisahan.

INTO (PARTITION p_h1, PARTITION p_h2)

TABLESPACE tablespace_name

Tidak
Nilai default: ruang tabel default dari tabel

Menentukan ruang penyimpanan tabel untuk partisi baru. Anda dapat menentukan ruang tabel yang berbeda atau sama untuk dua partisi baru.

TABLESPACE tbs_archive

Catatan

  • Anda harus menjadi pemilik tabel atau memiliki izin ALTER untuk tabel tersebut.

  • SPLIT PARTITION memperoleh AccessExclusiveLock, yaitu kunci eksklusif tingkat tabel. Kunci ini memblokir semua operasi Data Manipulation Language (DML) dan sebagian besar operasi Data Definition Language (DDL) pada tabel. Jalankan perintah ini selama jam non-puncak dengan menyediakan jendela waktu yang cukup.

  • Titik pemisahan harus valid:

    • Untuk partisi RANGE, nilai dalam klausa AT harus berada di antara batas atas dan bawah partisi yang akan dibagi.

    • Untuk partisi LIST, daftar nilai dalam klausa VALUES harus merupakan subset dari daftar nilai partisi yang akan dibagi.

Contoh

Membagi partisi rentang (RANGE)

Contoh ini menunjukkan cara membagi partisi log tahunan bernama p_2022 menjadi dua partisi semester bernama p_2022_h1 dan p_2022_h2.

Siapkan lingkungan

Langkah ini membuat tabel bernama log_archives yang dipartisi berdasarkan rentang waktu, serta menyisipkan data yang mencakup titik pemisahan.

-- Buat tabel terpartisi.
CREATE TABLE log_archives (
    log_id   INT NOT NULL,
    log_time DATE NOT NULL
)
PARTITION BY RANGE (log_time) (
    PARTITION p_2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD'))
);

INSERT INTO log_archives VALUES (1, TO_DATE('2022-01-10', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (2, TO_DATE('2022-02-15', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (3, TO_DATE('2022-03-20', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (4, TO_DATE('2022-05-05', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (5, TO_DATE('2022-06-25', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (6, TO_DATE('2022-07-15', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (7, TO_DATE('2022-08-01', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (8, TO_DATE('2022-10-30', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (9, TO_DATE('2022-11-11', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (10, TO_DATE('2022-12-24', 'YYYY-MM-DD'));

Lakukan pemeriksaan awal

Sebelum membagi partisi, pastikan data telah dicadangkan dan periksa apakah partisi asli tersedia.

-- Penting: Sebelum membagi partisi, pastikan Anda telah mencadangkan data terkait.
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'LOG_ARCHIVES';

Jalankan perintah

Gunakan 2022-07-01 sebagai titik pemisahan dan jalankan perintah SPLIT PARTITION.

ALTER TABLE log_archives SPLIT PARTITION p_2022 
AT (TO_DATE('2022-07-01', 'YYYY-MM-DD'))
INTO (PARTITION p_2022_h1, PARTITION p_2022_h2);

Verifikasi hasil

Verifikasi bahwa partisi asli digantikan oleh dua partisi baru, serta bahwa data didistribusikan dengan benar.

-- Verifikasi struktur: Konfirmasikan bahwa partisi baru dibuat dan partisi lama dihapus.
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'LOG_ARCHIVES';
-- Hasil kueri harus berisi p_2022_h1 dan p_2022_h2, tetapi tidak p_2022.

-- Verifikasi data: Konfirmasikan bahwa data didistribusikan berdasarkan titik pemisahan.
SELECT COUNT(*) FROM log_archives PARTITION (p_2022_h1); -- Hasilnya harus 5.
SELECT COUNT(*) FROM log_archives PARTITION (p_2022_h2); -- Hasilnya harus 5.

Membagi partisi daftar (LIST)

Contoh ini menunjukkan cara membagi partisi penjualan Asia bernama p_asia, yang berisi beberapa negara dan wilayah, menjadi partisi China terpisah bernama p_china, dan partisi lain bernama p_asia_others untuk negara dan wilayah Asia lainnya.

Siapkan lingkungan

Langkah ini membuat tabel bernama sales_by_region yang dipartisi berdasarkan daftar wilayah penjualan.

-- Buat tabel terpartisi.
CREATE TABLE sales_by_region (
    sale_id INT,
    country VARCHAR2(20)
)
PARTITION BY LIST (country) (
    PARTITION p_asia VALUES ('China', 'Japan', 'Korea', 'Singapore')
);
INSERT INTO sales_by_region VALUES (101, 'China');
INSERT INTO sales_by_region VALUES (102, 'China');
INSERT INTO sales_by_region VALUES (201, 'Japan');
INSERT INTO sales_by_region VALUES (301, 'Korea');
INSERT INTO sales_by_region VALUES (401, 'Singapore');

Lakukan pemeriksaan awal

Periksa apakah partisi p_asia tersedia dan periksa distribusi datanya.

SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_BY_REGION';
SELECT country, COUNT(*) FROM sales_by_region GROUP BY country;

Jalankan perintah

Gunakan klausa VALUES untuk membagi data untuk 'China' dari partisi p_asia ke partisi baru bernama p_china.

ALTER TABLE sales_by_region SPLIT PARTITION p_asia
VALUES ('China')
INTO (PARTITION p_china, PARTITION p_asia_others);

Verifikasi hasil

Verifikasi bahwa partisi asli digantikan oleh dua partisi baru, bahwa daftar nilainya ditetapkan dengan benar, serta bahwa data dipindahkan sesuai.

-- Verifikasi struktur: Konfirmasikan bahwa partisi baru dan daftar nilainya dibuat.
SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_BY_REGION';
-- Hasil kueri harus berisi:
-- P_CHINA, 'China'
-- P_ASIA_OTHERS, 'Japan', 'Korea', 'Singapore'

-- Verifikasi data: Konfirmasikan bahwa data didistribusikan ke partisi baru.
SELECT COUNT(*) FROM sales_by_region PARTITION (p_china);       -- Hasilnya harus 2.
SELECT COUNT(*) FROM sales_by_region PARTITION (p_asia_others); -- Hasilnya harus 3.

Pertanyaan Umum

T1: Mengapa saya menerima kesalahan ORA-14080: partisi tidak dapat dibagi?
Kesalahan ini biasanya terjadi karena titik pemisahan yang Anda tentukan tidak valid. Untuk partisi RANGE, nilai dalam klausa AT harus berada di antara batas atas dan bawah partisi yang dibagi. Untuk partisi LIST, daftar nilai dalam klausa VALUES harus merupakan subset yang tidak kosong dan tepat dari daftar nilai partisi yang dibagi.

T2: Mengapa saya menerima kesalahan ORA-14078: nama partisi sudah digunakan?
Kesalahan ini terjadi karena nama partisi baru yang Anda tentukan dalam klausa INTO sudah digunakan oleh partisi lain dalam tabel. Ubah nama tersebut menjadi nama yang unik dalam tabel.

T3: Mengapa SPLIT PARTITION lambat?
Operasi ini melibatkan pengaturan ulang dan penyalinan data fisik. Waktu eksekusi sebanding dengan jumlah data dalam partisi dan menghasilkan banyak I/O. Ini adalah operasi yang intensif sumber daya. Jalankan operasi ini selama jam non-puncak.

Pernyataan SQL terkait