全部产品
Search
文档中心

PolarDB:ALTER TABLE TRUNCATE SUBPARTITION

更新时间:Oct 24, 2025

Menghapus semua data dari subpartisi yang ditentukan dalam tabel partisi komposit. Operasi ini secara permanen menghapus data, tetapi mempertahankan struktur subpartisi. Pastikan bahwa data tersebut tidak lagi diperlukan atau telah dicadangkan sebelum menjalankan perintah ini.

Sinopsis

ALTER TABLE nama_tabel 
  TRUNCATE SUBPARTITION nama_subpartisi 
  [{DROP|REUSE} STORAGE]

Parameter

Parameter

Diperlukan

Deskripsi

Contoh

nama_tabel

Ya

Nama tabel target yang dipartisi komposit.

customer_data

nama_subpartisi

Ya

Nama subpartisi yang akan dipotong.

p_2022_asia

{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 memiliki izin ALTER pada tabel.

  • TRUNCATE SUBPARTITION 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 berikan waktu yang cukup untuk menyelesaikannya agar tidak memblokir operasi penting lainnya pada tabel.

  • Sebagai operasi DDL, TRUNCATE SUBPARTITION secara implisit melakukan commit transaksi saat ini. Setelah perintah dijalankan, data yang dihapus tidak dapat dipulihkan menggunakan ROLLBACK. Cadangkan data Anda sebelum melakukan operasi ini.

  • TRUNCATE SUBPARTITION adalah operasi metadata yang mencakup penghapusan file. Ini dapat diselesaikan dalam hitungan detik, bahkan untuk tabel dengan ratusan juta catatan. Beban I/O, CPU, dan memori sangat rendah.

Contoh

Contoh ini menunjukkan cara menghapus data dari subpartisi untuk data pengguna wilayah Asia tahun 2022. Contoh ini menggunakan tabel pelanggan partisi komposit berdasarkan rentang tahun pendaftaran (RANGE) dan wilayah pengguna (LIST).

Siapkan lingkungan

Langkah ini membuat tabel partisi komposit bernama customer_data. Tabel tersebut dipartisi berdasarkan rentang tahun pendaftaran (p_2022) dan kemudian dipartisi daftar berdasarkan wilayah pengguna (p_2022_asia dan p_2022_europe). Data uji kemudian dimasukkan ke dalam dua subpartisi ini.

-- Buat tabel partisi komposit
CREATE TABLE customer_data (
    customer_id  INT NOT NULL,
    region       VARCHAR2(10),
    reg_date     DATE
)
PARTITION BY RANGE (reg_date)
SUBPARTITION BY LIST (region)
(
    PARTITION p_2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD'))
    (
        SUBPARTITION p_2022_asia    VALUES ('Asia'),
        SUBPARTITION p_2022_europe  VALUES ('Europe')
    )
);

-- Masukkan data
INSERT INTO customer_data VALUES (101, 'Asia', TO_DATE('2022-06-10', 'YYYY-MM-DD'));
INSERT INTO customer_data VALUES (102, 'Europe', TO_DATE('2022-07-20', 'YYYY-MM-DD'));

Lakukan pemeriksaan awal

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

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

-- Periksa struktur subpartisi untuk mengonfirmasi bahwa subpartisi p_2022_asia ada.
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME = 'CUSTOMER_DATA';

-- Periksa data subpartisi untuk mengonfirmasi bahwa itu berisi data.
SELECT COUNT(*) FROM customer_data SUBPARTITION (p_2022_asia);

Jalankan perintah

Jalankan TRUNCATE SUBPARTITION untuk memotong subpartisi p_2022_asia.

ALTER TABLE customer_data TRUNCATE SUBPARTITION p_2022_asia;

Verifikasi hasil

Verifikasi bahwa struktur subpartisi dipertahankan dan data telah dihapus.

-- Verifikasi struktur: Konfirmasikan bahwa definisi subpartisi masih ada.
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'CUSTOMER_DATA';
-- Hasil kueri harus mencakup p_2022_asia.

-- Verifikasi data: Konfirmasikan bahwa data dalam subpartisi telah dikosongkan.
SELECT COUNT(*) FROM customer_data SUBPARTITION (p_2022_asia);
-- Hasil kueri adalah 0.

FAQ

P1: Apa perbedaan antara TRUNCATE SUBPARTITION dan DROP SUBPARTITION?

TRUNCATE SUBPARTITION menghapus data dari subpartisi tetapi mempertahankan definisinya. DROP SUBPARTITION menghapus definisi subpartisi dan datanya.

P2: Bisakah data dipulihkan setelah TRUNCATE SUBPARTITION dijalankan?

Tidak. TRUNCATE adalah operasi DDL yang secara permanen menghapus data. Secara default, itu tidak dicatat dalam log transaksi. Data tidak dapat dipulihkan menggunakan metode standar seperti rollback atau flashback.

P3: Apa perbedaan antara TRUNCATE SUBPARTITION dan DELETE FROM ... SUBPARTITION?

TRUNCATE SUBPARTITION adalah operasi DDL yang efisien yang langsung menghapus data dengan melepaskan blok data dan tidak dapat dibatalkan. DELETE adalah operasi DML yang menghapus data baris demi baris. Ini mencatat log, dapat dibatalkan, dan memicu pemicu hapus.

P4: Mengapa saya mendapatkan kesalahan "ORA-02149: relation ... does not exist"?

Kesalahan ini terjadi karena nama subpartisi tidak ada atau huruf besar/kecil dari nama yang ditentukan tidak sesuai dengan nama sebenarnya. Nama bersifat peka huruf besar/kecil. Untuk mengonfirmasi nama, lakukan pemeriksaan awal.

P5: Mengapa saya mendapatkan kesalahan "ORA-01031: insufficient privileges"?

Kesalahan ini terjadi karena pengguna yang menjalankan perintah tidak memiliki izin ALTER pada tabel target. Hubungi administrator basis data Anda untuk memberikan izin yang diperlukan.

Pernyataan SQL Terkait