全部产品
Search
文档中心

PolarDB:ALTER TABLE…TRUNCATE PARTITION

更新时间:Oct 24, 2025

Menghapus semua data dari partisi tertentu dalam tabel partisi. Operasi ini secara permanen menghapus data tetapi mempertahankan struktur partisi. Pastikan data tersebut tidak lagi diperlukan atau telah dicadangkan sebelum menjalankan perintah ini.

Sinopsis

ALTER TABLE table_name TRUNCATE PARTITION partition_name
  [{DROP|REUSE} STORAGE]

Parameter

Parameter

Diperlukan

Deskripsi

Contoh

table_name

Ya

Nama tabel partisi.

sales_records

partition_name

Ya

Nama partisi yang akan dipotong.

p_2023_q1

{DROP|REUSE} STORAGE

Tidak

Klausa ini diurai untuk kompatibilitas sintaksis Oracle tetapi diabaikan dan tidak berpengaruh pada penyimpanan.

DROP STORAGE/

REUSE STORAGE

Catatan

  • Anda harus menjadi pemilik tabel atau pengguna dengan hak istimewa untuk menjalankan perintah ini.

  • TRUNCATE PARTITION mendapatkan kunci eksklusif tingkat tabel AccessExclusiveLock. Kunci ini memblokir semua operasi Data Manipulation Language (DML) dan sebagian besar operasi Data Definition Language (DDL) pada tabel. Jalankan pernyataan ini selama jam non-puncak dan beri waktu yang cukup untuk menyelesaikannya agar tidak memblokir operasi penting lainnya pada tabel.

  • TRUNCATE PARTITION adalah operasi hanya metadata yang dikombinasikan dengan penghapusan file. Proses ini selesai dalam hitungan detik, bahkan untuk partisi dengan ratusan juta baris, dan memiliki overhead I/O, CPU, serta memori yang minimal.

  • Jika pemicu ON TRUNCATE didefinisikan pada tabel, operasi ini akan memicunya. Pastikan Anda memahami logika bisnis dari pemicu ini untuk mencegah efek samping yang tidak disengaja.

Contoh

Contoh ini menunjukkan cara memotong partisi kuartal historis dari tabel catatan penjualan. Ini merupakan tugas manajemen siklus hidup data umum, di mana Anda menghapus data lama tetapi mempertahankan struktur partisi untuk memuat data baru untuk periode yang sama nanti.

Siapkan lingkungan

Langkah ini membuat tabel bernama sales_records yang dipartisi berdasarkan rentang tanggal penjualan. Langkah ini juga membuat dua partisi, p_2023_q1 dan p_2023_q2, untuk menyimpan data untuk kuartal pertama dan kedua, masing-masing.

-- Buat tabel partisi
CREATE TABLE sales_records (
    sale_id    INT NOT NULL,
    product_id INT NOT NULL,
    sale_date  DATE NOT NULL
)
PARTITION BY RANGE (sale_date) (
    PARTITION p_2023_q1 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD')),
    PARTITION p_2023_q2 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD'))
);

-- Masukkan data
INSERT INTO sales_records VALUES (1, 101, TO_DATE('2023-01-15', 'YYYY-MM-DD'));
INSERT INTO sales_records VALUES (2, 102, TO_DATE('2023-04-20', 'YYYY-MM-DD'));
COMMIT;

Lakukan pemeriksaan awal

Sebelum memotong partisi, konfirmasikan bahwa data telah dicadangkan. Kemudian, periksa struktur dan data partisi target.

-- Penting: Sebelum Anda mengosongkan partisi, pastikan Anda telah mencadangkan data terkait.

-- Periksa struktur partisi untuk mengonfirmasi bahwa partisi p_2023_q1 ada.
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_RECORDS';

-- Periksa data partisi untuk mengonfirmasi bahwa partisi berisi data.
SELECT COUNT(*) FROM sales_records PARTITION (p_2023_q1);

Jalankan perintah

Jalankan perintah TRUNCATE PARTITION untuk memotong partisi p_2023_q1.

ALTER TABLE sales_records TRUNCATE PARTITION p_2023_q1;

Verifikasi hasil

Verifikasi bahwa struktur partisi dipertahankan dan data dihapus.

-- Verifikasi struktur: Konfirmasi bahwa definisi partisi masih ada.
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_RECORDS';
-- Hasil kueri masih berisi p_2023_q1.

-- Verifikasi data: Konfirmasi bahwa data dalam partisi telah dihapus.
SELECT COUNT(*) FROM sales_records PARTITION (p_2023_q1);
-- Hasil kueri adalah 0.

Operasi pemotongan membatalkan statistik tabel, yang dapat menurunkan kinerja kueri. Jalankan ANALYZE segera setelah operasi.

ANALYZE sales; -- Perbarui informasi statistik tabel induk.

FAQ

P1: Apa perbedaan antara TRUNCATE PARTITION dan DROP PARTITION?
TRUNCATE PARTITION hanya menghapus data dalam partisi tetapi mempertahankan definisi partisi. Sebaliknya, DROP PARTITION menghapus baik definisi partisi maupun semua datanya.

P2: Bisakah data dipulihkan setelah menjalankan TRUNCATE PARTITION?
Tidak. TRUNCATE adalah operasi DDL yang secara permanen menghapus data. Secara default, itu tidak dicatat dalam log transaksi dan tidak dapat dibatalkan atau dipulihkan menggunakan metode flashback standar.

P3: Mengapa saya mendapatkan kesalahan RA-02149: partisi yang ditentukan tidak ada saat saya menjalankan perintah ini?
Kesalahan ini menunjukkan bahwa partisi yang ditentukan tidak ada atau nama partisi tersebut tidak sesuai dengan huruf besar/kecil. Verifikasi nama partisi yang tepat dengan menjalankan kueri di bagian pemeriksaan awal, atau gunakan tanda kutip ganda untuk kecocokan yang tepat.

P4: Mengapa saya mendapatkan kesalahan ORA-01031: hak istimewa tidak mencukupi saat saya menjalankan perintah ini?
Kesalahan ini terjadi karena pengguna yang menjalankan perintah tidak memiliki hak istimewa ALTER pada tabel target. Hubungi administrator basis data Anda untuk memberikan hak istimewa yang diperlukan.

P5: Mengapa saya menerima kesalahan ERROR: cannot truncate partition of table because it has global indexes saat saya menjalankan perintah ini?

TRUNCATE PARTITION gagal jika tabel memiliki indeks global. Indeks global mempertahankan keunikan dan jalur akses di semua partisi. Operasi TRUNCATE tidak dapat dengan cepat membersihkan entri indeks tanpa mengorbankan integritas indeks global.

SQL Terkait pernyataan