Menghapus Ratusan Juta Record dari Oracle Table
Baru kemarin ketemu case yang lumayan menarik, aplikasi yang dibuat tahun lalu kena timeout ketika delete seluruh isi table yang berisi paling tidak 200juta record. Berikut error lengkapnya, fyi framework yang dipakai adalah MyBatis dan Spring Framework dan database yang dipakai adalah Oracle,
<2016-10-31 02:15:01,723>,[http-/0.0.0.0:8080-16]>>[INFO]start deleting TABLE_NAME Data <2016-10-31 02:18:02,426>,[http-/0.0.0.0:8080-16]>>[ERROR] ### Error updating database. Cause: java.sql.SQLException: ORA-01013: user requested cancel of current operation ### The error may involve id.edwin.service.delete-Inline ### The error occurred while setting parameters ### SQL: delete from TABLE_NAME ### Cause: java.sql.SQLException: ORA-01013: user requested cancel of current operation ; uncategorized SQLException for SQL []; SQL state [72000]; error code [1013]; ORA-01013: user requested cancel of current operation ; nested exception is java.sql.SQLException: ORA-01013: user requested cancel of current operation
sepertinya sudah timeout duluan (3menit timeout), padahal belum semua data terhapus. 🙁
Setelah googling bentar, sepertinya ada dua solusi yaitu menggunakan TRUNCATE dan CTAS (CREATE TABLE AS SELECT). Setelah diskusi panjang lebar dengan kuncen (admin) Database, opsi terakhir (sepertinya) jauh lebih cepat, drop table tersebut kemudian di re-create ulang. Berikut adalah query-nya
CREATE TABLE TABLE_NAME_NEW AS SELECT * FROM TABLE_NAME WHERE ROWNUM = 1 ; Rename TABLE_NAME to TABLE_NAME_OLD ; Rename TABLE_NAME_NEW to TABLE_NAME; drop table TABLE_NAME_OLD ;
Setelah itu baru didelete isi table TABLE_NAME, lebih cepat karena isi datanya hanya 1 row. Satu-satunya kekurangan adalah, tidak bisa replicate Primary Key dan Index dari table yang sebelumnya di drop, yang mana itu bukanlah masalah bagi saya 😀
No Comments