Untuk mengakomodasi pertumbuhan data, gunakan ALTER TABLE ... ADD PARTITION untuk menambahkan satu atau lebih partisi baru yang kosong ke tabel partisi yang sudah ada. Ini menyederhanakan pengelolaan rentang data baru atau kategori serta memastikan efisiensi dalam pemuatan data dan kueri.
Cara kerjanya
ALTER TABLE ... ADD PARTITION adalah operasi metadata, tetapi dampak performa dan konkurensinya terutama ditentukan oleh konfigurasi indeks tabel.
Perilaku Kunci: Saat menjalankan
ADD PARTITION, database memperolehkunci eksklusifpada tabel target. Kunci ini memblokir semua operasi baca dan tulis bersamaan (SELECT,INSERT,UPDATE, danDELETE) pada tabel. Durasi kunci tergantung pada waktu yang diperlukan untuk membuat indeks pada partisi baru.Pemeliharaan Indeks
Indeks Lokal: Perintah ini secara otomatis membuat partisi indeks yang sesuai pada partisi baru. Jika tabel memiliki beberapa indeks lokal, sistem akan membuat partisi baru untuk masing-masing. Inilah alasan utama durasi operasi.
Indeks Global: Struktur tetap tidak berubah karena mencakup data yang dimasukkan ke dalam partisi baru tanpa pemeliharaan tambahan.
Durasi Operasi
Tabel Tanpa Indeks: Operasi hampir instan karena hanya memperbarui metadata tabel.
Tabel Dengan Indeks: Durasi operasi sebanding dengan waktu yang diperlukan untuk membuat indeks lokal pada partisi baru yang kosong.
Keterbatasan
Aturan Definisi Dasar
Konsistensi Tipe Partisi: Partisi baru harus sesuai dengan tipe partisi yang ada pada tabel (
LISTatauRANGE).Konsistensi Kunci Partisi: Aturan partisi untuk partisi baru harus merujuk pada kolom kunci partisi yang sama seperti yang didefinisikan untuk tabel.
Nama Partisi Unik: Nama partisi baru harus unik di antara semua partisi dan subpartisi tabel.
Pembatasan Nilai Partisi
MAXVALUEdanDEFAULTPartisiBatasan: Anda tidak dapat menambahkan partisi baru ke tabel partisi rentang yang memiliki partisi
MAXVALUEatau ke tabel partisi daftar yang memiliki partisiDEFAULT. Hal ini karena partisiMAXVALUEdanDEFAULTsecara logis mencakup semua nilai yang tidak ditentukan, sehingga tidak ada ruang untuk partisi baru.Solusi: Gunakan
ALTER TABLE ... SPLIT PARTITIONuntuk membagi partisiMAXVALUEatauDEFAULT. Ini menciptakan batas baru, memungkinkan Anda menambahkan partisi baru.- Catatan
Operasi ini dapat memindahkan data, yang dapat menghasilkan overhead I/O dan kunci yang signifikan. Lakukan operasi ini selama jam non-puncak atau dalam jendela pemeliharaan.
-- Contoh: Pisahkan partisi MAXVALUE untuk menambahkan partisi untuk tahun 2024 ALTER TABLE sales SPLIT PARTITION max_partition AT (TO_DATE('2025-01-01', 'YYYY-MM-DD')) INTO (PARTITION p_2024, PARTITION max_partition);
RANGEPersyaratan Urutan Partisi Untuk partisiRANGEbaru, nilaiVALUES LESS THANharus lebih besar dari batas atas partisi tertinggi yang ada. Jika tidak, operasi gagal.LISTNilai Unik PartisiNilai partisi
LISTbaru tidak boleh tumpang tindih dengan yang ada di partisi lainnya. Jika tidak, operasi gagal dengan kesalahan sepertiERROR: partition "xx" would overlap partition "xxx".
Persyaratan Hak Istimewa
Untuk menjalankan
ALTER TABLE ... ADD PARTITION, Anda harus menjadi pemilik tabel atau menggunakan akun istimewa.
Praktik terbaik
Jalankan dalam Jendela Pemeliharaan: Karena
ADD PARTITIONmemperoleh kunci eksklusif pada tabel, hal ini memblokir operasi DML dan DDL. Untuk tabel besar dengan indeks lokal, proses pembuatan indeks bisa memakan waktu lama, menyebabkan gangguan layanan yang berkepanjangan. Kami merekomendasikan melakukan operasi ini selama jam non-puncak atau jendela pemeliharaan terjadwal untuk menghindari pemblokiran layanan online Anda.Monitor Tunggu Kunci: Selama operasi, pantau database untuk tunggu kunci. Jika waktu tunggu kunci berlebihan, Anda mungkin perlu menghentikan operasi dan menjadwalkannya ulang.
Jumlah Partisi yang Direkomendasikan: Meskipun tidak ada batasan fisik pada jumlah partisi yang dapat dimiliki sebuah tabel, kami merekomendasikan menjaga total jumlah partisi untuk satu tabel di bawah 1.000 untuk alasan manajemen dan performa. Jumlah partisi yang berlebihan meningkatkan biaya penguraian bagi Pengoptimal Kueri, yang dapat menurunkan performa kueri.
Sintaksis
Sintaksis dasar
ALTER TABLE nama_tabel ADD PARTITION spesifikasi_partisi;spesifikasi_partisi
-- Untuk partisi LIST PARTITION nama_partisi VALUES (daftar_nilai) [TABLESPACE nama_tablespace] [(spesifikasi_subpartisi, ...)] -- Untuk partisi RANGE PARTITION nama_partisi VALUES LESS THAN (daftar_nilai) [TABLESPACE nama_tablespace] [(spesifikasi_subpartisi, ...)]spesifikasi_subpartisi
-- Untuk subpartisi LIST SUBPARTITION nama_subpartisi VALUES (daftar_nilai) [TABLESPACE nama_tablespace] -- Untuk subpartisi RANGE SUBPARTITION nama_subpartisi VALUES LESS THAN (daftar_nilai) [TABLESPACE nama_tablespace]
Parameter
Parameter | Deskripsi |
| Nama tabel partisi target. |
| Nama partisi baru yang akan dibuat. Harus unik di antara semua partisi dan subpartisi tabel. |
| Untuk partisi |
| Untuk partisi |
| Tentukan tablespace untuk partisi atau subpartisi baru. Jika tidak ditentukan, tablespace default tabel digunakan. |
| Nama subpartisi baru yang akan dibuat. Harus unik di antara semua partisi dan subpartisi tabel. |
Tambahkan partisi ke tabel partisi daftar
Gunakan operasi ini untuk menambahkan kategori data baru ke tabel yang dipartisi berdasarkan daftar nilai diskrit, seperti negara atau kode status.
Buat tabel partisi daftar contoh. Tabel
sales_listberikut dipartisi berdasarkan kolomcountry.CREATE TABLE sales_list ( dept_no NUMBER, part_no VARCHAR2(50), country VARCHAR2(20), sale_date DATE, amount NUMBER ) PARTITION BY LIST(country) ( PARTITION europe VALUES ('FRANCE', 'ITALY'), PARTITION asia VALUES ('INDIA', 'PAKISTAN'), PARTITION americas VALUES ('US', 'CANADA') );Gunakan perintah
ALTER TABLE ... ADD PARTITIONuntuk menambahkan partisi baru bernamaeast_asiauntuk menyimpan data untuk'CHINA'dan'KOREA'.ALTER TABLE sales_list ADD PARTITION east_asia VALUES ('CHINA', 'KOREA');(Opsional) Verifikasi bahwa partisi baru berhasil ditambahkan.
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS WHERE table_name = 'sales_list';Hasil kueri harus mencakup partisi
east_asiayang baru ditambahkan.
Tambahkan partisi ke tabel partisi rentang
Gunakan operasi ini untuk menambahkan periode waktu baru atau rentang numerik ke tabel yang dipartisi berdasarkan rentang nilai kontinu, seperti tanggal atau ID.
Buat tabel partisi rentang contoh. Tabel
sales_rangeberikut dipartisi berdasarkan kolomsale_date.CREATE TABLE sales_range ( dept_no NUMBER, part_no VARCHAR2(50), country VARCHAR2(20), sale_date DATE, amount NUMBER ) PARTITION BY RANGE(sale_date) ( PARTITION q1_2023 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD')), PARTITION q2_2023 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD')), PARTITION q3_2023 VALUES LESS THAN (TO_DATE('2023-10-01', 'YYYY-MM-DD')), PARTITION q4_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')) );CatatanContoh ini menggunakan fungsi
TO_DATEuntuk memastikan kejelasan format tanggal. Dalam praktiknya, format string harus sesuai dengan pengaturanNLS_DATE_FORMATdatabase.Gunakan
ALTER TABLE ... ADD PARTITIONuntuk menambahkan partisi baru bernamaq1_2024. Rentang partisi baru harus lebih besar dari batas atas semua partisi yang ada.ALTER TABLE sales_range ADD PARTITION q1_2024 VALUES LESS THAN (TO_DATE('2024-04-01', 'YYYY-MM-DD'));(Opsional) Verifikasi bahwa partisi baru berhasil ditambahkan.
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS WHERE table_name = 'sales_range';Hasil kueri harus mencakup partisi
q1_2024yang baru ditambahkan di akhir daftar partisi.
Tambahkan partisi ke tabel partisi komposit
Untuk tabel partisi komposit, seperti RANGE-LIST, ADD PARTITION memungkinkan Anda mendefinisikan subpartisi pada saat yang sama saat Anda menambahkan partisi utama.
Buat tabel partisi komposit
RANGE-LISTcontoh.CREATE TABLE composite_sales ( sale_id NUMBER, sale_date DATE, region VARCHAR2(20) ) PARTITION BY RANGE(sale_date) SUBPARTITION BY LIST(region) ( PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')) ( SUBPARTITION p_2023_north VALUES ('NORTH'), SUBPARTITION p_2023_south VALUES ('SOUTH') ) );Tambahkan partisi utama baru bernama
p_2024dan definisikan dua subpartisi:northdansouth.ALTER TABLE composite_sales ADD PARTITION p_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')) ( SUBPARTITION p_2024_north VALUES ('NORTH'), SUBPARTITION p_2024_south VALUES ('SOUTH') );(Opsional) Verifikasi bahwa subpartisi baru berhasil dibuat.
SELECT nama_partisi, nama_subpartisi, high_value FROM ALL_TAB_SUBPARTITIONS WHERE nama_tabel = 'composite_sales' AND nama_partisi = 'p_2024';