Çok büyük bir uygulama (bir tabloda 500 milyondan fazla satır içeren yaklaşık 1 TB veri) Oracle veritabanı arka ucuna sahip bir uygulamayı yönetiyorum. Veritabanı gerçekten hiçbir şey yapmıyor (SProcs yok, tetikleyici yok ya da hiçbir şey yok) sadece bir veri deposu.
Her ay ana tabloların ikisinden kayıtları temizlememiz gerekiyor. Temizleme kriterleri değişir ve sıra yaşı ile birkaç durum alanının birleşimidir. Genellikle ayda 10 ila 50 milyon satır temizliyoruz (ithalat yoluyla haftada yaklaşık 3-5 milyon satır ekliyoruz).
Şu anda bu silme işlemini yaklaşık 50.000 satırlık gruplar halinde yapmak zorundayız (örn. 50000'ü sil, comit, 50000'ü sil, kesin, tekrarla). Toplu işin tamamını bir defada silmeye çalışmak, veritabanını yaklaşık bir saat boyunca yanıt vermemeye başlar (satırların sayısına bağlı olarak). Bu gibi gruplar halinde satırları silmek sistemde çok zordur ve bunu bir hafta boyunca "zamanın izin verdiği ölçüde" yapmak zorundayız; komut dosyasının sürekli çalışmasına izin vermek, kullanıcı tarafından kabul edilemez bir performans düşüşü ile sonuçlanabilir.
Bu tür toplu silme işleminin dizin performansını da düşürdüğüne ve sonunda veritabanının performansının düşmesine neden olan başka etkilere sahip olduğuna inanıyorum. Yalnızca bir tabloda 34 dizin vardır ve dizin veri boyutu aslında verilerin kendisinden daha büyüktür.
İşte BT çalışanlarımızdan birinin bu tasfiyeyi yapmak için kullandığı komut dosyası:
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;
Bu veritabanı % 99.99999 olmalıdır ve yılda sadece bir kez 2 günlük bakım penceremiz var.
Bu kayıtları kaldırmak için daha iyi bir yöntem arıyorum, ama henüz herhangi bir bulmak. Herhangi bir öneri?