Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi

0
Yüklü miktarda kayıt silme nasıl yapılır?

Açık 1 Cevaplar 655 Gösterim Veri Tabanı
Database deki tablo içinde 100K kayıt silmem lazım , Nasıl silebilirim?

Not: Aktif olarak çalışan bir proje olduğu için (RPOD) en etkili şekilde nasıl silebilirim diğer sistemleri etkilemeden.
2Yorumlar
(586 puan)
hangi veritabanı sisteminden siliyorsunuz?
(1.9k puan)
Oracle database kullanıyorum.

1 cevap

1

Öncelikle canlı veritabanı olduğu için, veritabanının arşiv modda olduğunu varsayıyorum. 

Oracle'da her türlü DML işlemleri (update-delete-insert)  arşiv dosyası üremesine sebep olur. Ne kadar çok data silerseniz, veritabanı o kadar çok arşiv dosyası üretecektir. Bundan dolayı öncelikle arşiv dosyasının yazıldığı diskte yeterli yer olduğundan emin olun.

Yine Oracle'da yapılan tüm veri değişiklikleri UNDO tablespace'de tutulur.  Oracle böylelikle data tutarlılığını korur. UNDO tablespace'de yeterince yer olduğundan yine emin olun.

Silme işlemini bir index üzerinden iletmeniz daha iyi olabilir.  Eğer where koşulunda belirttiğiniz datayı belirleyici kolonlar üzerinde index yoksa, index oluşturun. index'lerin oluşturduktan sonra, select ile sorgunun hızlı gelip gelmediğini, cost'unu kontrol edin.  Select ne kadar hızlı geliyor ise, delete de o kadar hızlı olacaktır.  Eğer mümkünse, primary key üzerinden datayı ayırt edebiliyorsanız çok daha iyi olur.

Yukarıda olabilir dedim, çünkü eğer tablo ciddi derecede büyükse, Oracle index kullanmamayı tercih edip, full scan yapabilir. Index kullanması için sorguda hint kullanabilirsiniz ama yine delete scriptini inceleyip execution plana bakıp cost'larını incelemek , ona göre karar vermek gerekir.

-Eğer lisansınız varsa, uygulama yapınız uygunsa, tablo üzerinde parallel'lik açabilirsiniz.  delete scriptinde paralel hint kullanarak işlemi hızlandırabilirsiniz.

-Silme işleminin tamamını bir anda yapmayın, mümkünse parçalara bölün ve aralarda commit'leyin. Mesela her 10bin kayıt sonrası commit işlemi iyi olacaktır. Veritabanına nefes aldırmış olursunuz :)  commit işlemi sırasında tabloya erişim kesilir.  commit ne kadar kısa sürerse, diğer kullanıcıları o kadar az bekletmiş olursunuz.

-Bu işlemi kesinlikle sistemin en az yoğun olduğu vakitte yapın. Gece job kurabilirsiniz. ama yine takip etmek faydalı olacaktır. 

Eğer kesinti süresi mümkün olsaydı, daha etkin çözümler olurdu.  

--> create table new_table as select * from  old_table where....   şeklinde tabloyu temizleyebilirdiniz.

--> tablo üzerinde partioning oluşturarak, partion'ları silerek data temizleyebilirdiniz.

(586 puan)
1Yorumlar
(4k puan)