Perbedaan SQL "Truncate" dengan "Delete"

TRUNCATE
- Truncate akan menghapus tuntas seluruh record dari sebuah tabel tanpa menggunakan kondisi WHERE
- Truncate lebih cepat dalam memproses dan menggunakan lebih sedikit sumber daya komputer termasuk log transaksi
- Truncate hanya akan menghapus record sja, namun struktur tabel termasuk kolom, konstrain, indeks tidak dihapus.
- Truncate tidak dapat digunakan pada sebuah tabel yang menjadi referensi bagi Foreign Key Constraint
- Truncate dapat dikelompokkan menjadi perintah Data Definition Language
- Truncate tidak dapat mengaktifkan Trigger
- Truncate tidak dapat di RollBack
- Truncate akan melakukan Reset Identity pada sebuah tabel

DELETE
- Delete akan menghapus record berdasarkan kondisi dengan menggunakan klausa WHERE
- Delete lebih lambat dalam memproses data dan mengunakan lebih banyak sumber daya komputer termasuk log transaksi
- Delete dapat digunakan pada tabel yang menjadi referensi Foreign Key
- Delete dapat dikelompokkan menjadi perintah Data Manipulation Language
- Delete dapat mengaktifkan Trigger
- Delete dapat di RollBack
- Delete tidak akan melakukan Reset Identity pada sebuah tabel

Truncate table bisa dianalogikan dengan sintaks delete tanpa where clause.

Truncate table masuk kategori DDL (Data Definition Language), karena masuk ke kelas DDL maka secara implisit sintaknya langsung commit, data yang yang di truncate tidak bisa di rollback. truncate table juga secara default
mengembalikan nilai HWM ke block awal ("truncate table x" sama dengan "truncate table x drop storage").

Nilai HWM ini berpengaruh terhadap performance query terhadap table, karena query akan membaca dulu nilai dari HWM. Tapi kita bisa juga men-truncate table tanpa mengembalikan nilai HWM dengan cara "truncate table reuse
storage", jadinya hampir sama dengan delete tanpa where bedanya delete bisa di rollback truncate tidak bisa di rollback setelah di eksekusi.

Kalau delete masuk kelas DML (Data Manipulation Language) untuk menyatakan commit, kita harus bilang secara explisit, beda untuk sintaks-sintaks DDL yang langsung commit.

Soal kalau block mana yang akan diisi oleh Oracle setelah di truncate atau di delete ngga pernah dipengaruhi sama nilai HWM, yang berpengaruh tetep nilai pctused dan pctfree dari table yang kita buat. Makanya meskipun hapusnya
pake perintah delete, blok yang diisi bukan setelah nilai hwm tapi balik lagi ke blok pertama yang kosong yang ada di daftar freelist.

Comments