全部产品
Search
文档中心

PolarDB:ALTER TABLE ADD SUBPARTITION

更新时间:Oct 24, 2025

Menambahkan subpartisi baru ke partisi tingkat pertama tertentu dari tabel partisi komposit. Operasi ini memperluas struktur partisi dan memengaruhi distribusi data. Pastikan kebijakan subpartisi telah didefinisikan untuk partisi induk, serta batas atau nilai subpartisi baru tidak bertentangan dengan subpartisi yang sudah ada sebelum menjalankan pernyataan ini.

Sinopsis

ALTER TABLE nama_tabel 
MODIFY PARTITION nama_partisi 
ADD SUBPARTITION { list_subpartition | range_subpartition };

-- Definisi subpartisi LIST
SUBPARTITION nama_subpartisi
  VALUES (nilai[, nilai]...)
  [TABLESPACE nama_tablespace]

-- Definisi subpartisi RANGE
SUBPARTITION nama_subpartisi
  VALUES LESS THAN (nilai[, nilai]...) 
  [TABLESPACE nama_tablespace]

Parameter

Parameter

Diperlukan

Deskripsi Parameter

Contoh

nama_tabel

Ya

Nama tabel partisi komposit target.

sales_data

nama_partisi

Ya

Nama partisi tingkat pertama target tempat subpartisi baru akan ditambahkan.

p_2023

nama_subpartisi

Ya

Nama subpartisi baru.

sp_q1_asia

VALUES

Ya

Mendefinisikan nilai batas untuk subpartisi baru.
- Untuk subpartisi LIST, nilai adalah satu atau lebih nilai literal.
- Untuk subpartisi RANGE, gunakan klausa LESS THAN untuk mendefinisikan batas atas.

VALUES('Asia') atau
VALUES LESS THAN (TO_DATE(...))

TABLESPACE nama_tablespace

Opsional
Nilai default: Tablespace default tabel.

Menentukan tablespace untuk subpartisi baru. Jika parameter ini dihilangkan, maka akan menggunakan tablespace default tabel.

TABLESPACE users_tbs

Catatan

  • Tipe subpartisi baru (LIST atau RANGE) harus sesuai dengan tipe subpartisi yang ada di bawah partisi induk yang sama.

  • nama_subpartisi harus unik di antara semua partisi dan subpartisi dalam tabel.

  • Saat menambahkan subpartisi RANGE, nilai batas yang didefinisikan oleh VALUES LESS THAN (...) harus lebih besar dari batas atas semua subpartisi yang ada. Subpartisi RANGE hanya dapat ditambahkan secara berurutan naik. Untuk menyisipkan subpartisi di tengah, gunakan pernyataan ALTER TABLE ... SPLIT SUBPARTITION untuk membagi subpartisi yang ada.

  • Saat menambahkan subpartisi LIST, nilai dalam daftar VALUES (...) tidak boleh tumpang tindih dengan nilai subpartisi lainnya di bawah partisi induk yang sama.

  • ADD SUBPARTITION mengakuisisi kunci eksklusif tingkat tabel (AccessExclusiveLock). Kunci ini memblokir semua operasi DML dan sebagian besar operasi DDL pada tabel. Jalankan perintah ini selama jam non-puncak dan sediakan jendela waktu yang cukup untuk menyelesaikannya.

  • ADD SUBPARTITION tidak membatasi jumlah subpartisi yang dapat Anda tambahkan. Namun, sumber daya sistem memberlakukan batas praktis. Untuk performa dan kemampuan kelola yang optimal, pertahankan total jumlah partisi untuk satu tabel di bawah 1.000.

  • Jangan gunakan ADD SUBPARTITION untuk menambahkan subpartisi ke partisi yang diatur oleh aturan MAXVALUE atau DEFAULT.

  • Jika tabel memiliki indeks, database secara otomatis membuat indeks partisi yang sesuai pada subpartisi baru.

  • Anda harus menjadi pemilik tabel atau memiliki hak istimewa administrator untuk menjalankan perintah ini.

  • Subpartisi baru awalnya tidak memiliki statistik. Untuk memastikan pengoptimal kueri menghasilkan rencana eksekusi yang akurat, kumpulkan statistik untuk tabel segera setelah operasi ini.

Contoh

Menambahkan subpartisi LIST ke tabel partisi komposit RANGE-LIST

Contoh ini menambahkan subpartisi baru untuk wilayah Afrika ke partisi untuk tahun 2023. Tabel tersebut dipartisi komposit berdasarkan tahun penjualan (RANGE) dan wilayah penjualan (LIST).

Persiapkan lingkungan

Langkah ini membuat tabel partisi komposit RANGE-LIST bernama sales_data. Tabel tersebut dipartisi berdasarkan RANGE pada sale_date dan subpartisi berdasarkan LIST pada region.

-- Buat tabel partisi komposit RANGE-LIST
CREATE TABLE sales_data (
    sale_id    INT,
    region     VARCHAR2(20),
    sale_date  DATE
)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY LIST (region)
(
    PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))
    (
        SUBPARTITION sp_2023_asia   VALUES ('Asia'),
        SUBPARTITION sp_2023_europe VALUES ('Europe')
    )
);

Lakukan pra-pemeriksaan

Sebelum menambahkan subpartisi, verifikasi bahwa partisi tingkat pertama target ada dan periksa daftar subpartisi saat ini.

-- Periksa bahwa partisi tingkat pertama p_2023 ada
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_DATA';

-- Periksa subpartisi yang ada di bawah p_2023 untuk memastikan bahwa nilai baru 'Afrika' belum ada
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'SALES_DATA' AND PARTITION_NAME = 'P_2023';

Jalankan perintah

Jalankan perintah ADD SUBPARTITION untuk menambahkan subpartisi baru dengan nilai 'Afrika' ke partisi p_2023.

ALTER TABLE sales_data MODIFY PARTITION p_2023 ADD SUBPARTITION sp_2023_africa VALUES('Africa');

Verifikasi hasil

Verifikasi bahwa subpartisi baru ada dan dapat menerima data yang sesuai dengan definisi nilainya.

-- Verifikasi struktur: Pastikan subpartisi baru telah ditambahkan
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'SALES_DATA' AND PARTITION_NAME = 'P_2023';
-- Hasil kueri harus mencakup sp_2023_africa

-- Verifikasi data: Coba masukkan data ke subpartisi baru dan verifikasi
INSERT INTO sales_data VALUES (101, 'Africa', TO_DATE('2023-09-15', 'YYYY-MM-DD'));

SELECT COUNT(*) FROM sales_data SUBPARTITION (sp_2023_africa);
-- Hasil kueri harus 1

Menambahkan subpartisi RANGE ke tabel partisi komposit RANGE-RANGE

Contoh ini menambahkan subpartisi untuk kuartal kedua (Q2) ke partisi 2023 dari tabel yang dipartisi komposit berdasarkan tahun pesanan (RANGE) dan tanggal pesanan (RANGE).

Prasyarat

Langkah ini membuat tabel partisi komposit RANGE-RANGE bernama order_history. Tabel tersebut dipartisi berdasarkan RANGE pada order_date dan kemudian subpartisi berdasarkan RANGE pada order_date.

-- Asumsikan bahwa tablespace bernama archive_tbs sudah ada
-- CREATE TABLESPACE archive_tbs DATAFILE 'archive_tbs.dbf' SIZE 10M;

-- Buat tabel partisi komposit RANGE-RANGE
CREATE TABLE order_history (
    order_id   INT,
    order_date DATE
)
PARTITION BY RANGE (order_date)
SUBPARTITION BY RANGE (order_date)
(
    PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))
    (
        SUBPARTITION sp_2023_q1 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD'))
    )
);

Lakukan pra-pemeriksaan

Verifikasi bahwa partisi tingkat pertama target ada dan periksa batas subpartisi saat ini untuk memastikan batas baru tidak menyebabkan konflik.

-- Periksa bahwa partisi tingkat pertama p_2023 ada
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'ORDER_HISTORY';

-- Periksa subpartisi yang ada dan batas-batasnya di bawah p_2023
SELECT SUBPARTITION_NAME, HIGH_VALUE FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'ORDER_HISTORY' AND PARTITION_NAME = 'P_2023';

Jalankan perintah

Jalankan perintah ADD SUBPARTITION untuk menambahkan subpartisi baru dengan batas atas 2023-07-01 ke partisi p_2023.

ALTER TABLE order_history MODIFY PARTITION p_2023 
ADD SUBPARTITION sp_2023_q2 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD'));

Verifikasi hasil

Verifikasi bahwa subpartisi baru telah dibuat, dan Anda dapat memasukkan data ke dalamnya.

-- Verifikasi struktur: Pastikan subpartisi baru telah ditambahkan dan periksa tablespace-nya
SELECT * FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'ORDER_HISTORY' AND SUBPARTITION_NAME = 'SP_2023_Q2';
-- Hasil kueri harus menunjukkan SP_2023_Q2 dan ARCHIVE_TBS

-- Verifikasi data: Coba masukkan data ke subpartisi baru dan verifikasi
INSERT INTO order_history VALUES (201, TO_DATE('2023-05-20', 'YYYY-MM-DD'));

SELECT COUNT(*) FROM order_history SUBPARTITION (sp_2023_q2);
-- Hasil kueri harus 1

FAQ

T1: Mengapa saya mendapatkan kesalahan ORA-14321: subpartisi ... sudah ada?
Kesalahan ini terjadi karena definisi VALUES untuk subpartisi baru bertentangan dengan yang sudah ada di bawah partisi tingkat pertama yang sama. Untuk subpartisi LIST, nilai sudah ada; untuk subpartisi RANGE, batas baru tidak lebih tinggi dari yang terakhir. Tentukan nilai batas yang tidak tumpang tindih untuk subpartisi baru.

T2: Mengapa saya mendapatkan kesalahan ORA-02269: partisi tidak ada?
Kesalahan ini terjadi karena nama_partisi yang ditentukan dalam klausa MODIFY PARTITION tidak ada. Kueri tampilan USER_TAB_PARTITIONS untuk memverifikasi nama partisi tingkat pertama yang benar.

T3: Mengapa saya mendapatkan kesalahan ORA-14150: subpartisi tidak ditentukan?
Anda mencoba menjalankan ADD SUBPARTITION pada tabel partisi yang tidak memiliki kebijakan subpartisi. Perintah ini hanya berlaku untuk tabel partisi komposit.

T4: Mengapa saya mendapatkan kesalahan ORA-01031: hak istimewa tidak mencukupi?
Pengguna yang menjalankan perintah tidak memiliki hak istimewa ALTER pada tabel target. Hubungi administrator basis data untuk memberikan hak istimewa yang diperlukan.

T5: Mengapa saya menerima kesalahan ORA-14074: batas partisi harus lebih tinggi dari partisi terakhir?

Perintah ADD SUBPARTITION hanya dapat menambahkan subpartisi RANGE di akhir rentang yang ada. Untuk menyisipkan subpartisi di tengah, gunakan perintah SPLIT SUBPARTITION sebagai gantinya.

Pernyataan terkait