Saya mengelola aplikasi yang sangat besar (hampir 1TB data dengan lebih dari 500 juta baris dalam satu tabel) database Oracle back end. Basis data tidak benar-benar melakukan apa-apa (tidak ada SProcs, tidak ada pemicu atau apa pun) itu hanya menyimpan data.
Setiap bulan kita diharuskan untuk membersihkan catatan dari dua tabel utama. Kriteria untuk pembersihan bervariasi dan merupakan kombinasi umur baris dan beberapa bidang status. Kami biasanya membersihkan antara 10 dan 50 juta baris per bulan (kami menambahkan sekitar 3-5 juta baris per minggu melalui impor).
Saat ini kami harus melakukan penghapusan ini dalam batch sekitar 50.000 baris (mis. Hapus 50000, komit, hapus 50000, komit, ulangi). Mencoba menghapus seluruh kumpulan sekaligus, membuat basis data tidak responsif selama sekitar satu jam (tergantung pada # baris). Menghapus baris dalam batch seperti ini sangat kasar pada sistem dan kami biasanya harus melakukannya "sesuai waktu" selama satu minggu; membiarkan skrip berjalan terus menerus dapat mengakibatkan penurunan kinerja yang tidak dapat diterima pengguna.
Saya percaya bahwa penghapusan batch seperti ini juga menurunkan kinerja indeks dan memiliki dampak lain yang akhirnya menyebabkan kinerja database menurun. Ada 34 indeks hanya dalam satu tabel, dan ukuran data indeks sebenarnya lebih besar dari data itu sendiri.
Berikut ini skrip yang digunakan oleh salah satu staf TI kami untuk melakukan pembersihan ini:
BEGIN
LOOP
delete FROM tbl_raw
where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000;
exit when SQL%rowcount < 49999;
commit;
END LOOP;
commit;
END;
Basis data ini harus mencapai 99,99999% dan kami hanya memiliki jendela pemeliharaan 2 hari setahun sekali.
Saya mencari metode yang lebih baik untuk menghapus catatan ini, tetapi saya belum menemukan. Ada saran?