Sql Server’da Büyük Tablolardan Veri Temizleme Yöntemleri
Veri tabanı yöneticileri sorumlu oldukları veri tabanlarının bakım ve yönetimini yapmak ile birlikte sistem kaynaklarının kullanım durumlarını sürekli takip ederler. Cpu, Disk, Ram gibi donanımları sürekli göz önünde tutarak sistemi sürekli sağlıklı tutmaya çalışırlar ki sistemin işleyişi ve sürekliliği devam edebilsin. Disk dolduğunu beyan ederek sürekli disk eklemek, Cpu değerleri maksimum değerlerde geziyor diyerek sisteme sürekli Cpu eklemek hoş karşılanacak bir durum değildir. Sorumlu olduğu sistemi yönetmek kadar planlama yapmak oldukça önemlidir.
Büyük veri tabanları ile çalışıldığında:
- Index bakımları ve Backup alma sürelerini uzar.
- Restore testleri yapmak zorlaşır.
- Herhangi bir afet anında Restore işlemini yapmak saatleri bulabilir.
- RTO ve RPO değerlerinde Uptime değerlerini her zaman düşük kılar.
- AlwaysOn’da yapılarda Lag oluşumunu tetikler.
- DML işlemlerinde performans kaybı her zaman olur.
- IntegrityCheck süreleri uzar. Herhangi bir bozulmada veri tabanlarını tamir etmek zorlaşır.
- Raporlama süreçlerinde gecikmeler olur.
Tablolar üzerindeki veriler belirli bir zaman geçtikten sonra bir anlamı yoksa direk silme işlemine geçilebilir. KVVK ya da GDPR kapsamında arşivlenmesi gereken veriler olabilir. Saklanma süreleri boyunca sıfır veri kaybı hedeflenerek Data Warehouse’a taşıma – kopyalama süreçleri tamamlandıktan sonra canlıdan veri silme süreci yapılabilir. Bahsi geçen senaryolar tamamen iş süreçleri ile alakalı bir durumdur.
Tablo üzerinden veri silmek için aşağıdaki adımlardan en uygun olanı seçebilirsiniz:
- Drop komutu ile tabloyu direk yok edebilirsiniz. 🙂
- Truncate ile direk log tutmadan içeriğinin tamamen silinmesini sağlayabilirsiniz.
- Yeni bir tablo oluşturarak mevcut tablo ile Rename yapıp yeni tablonun sürece dahil olmasını sağlayabilirsiniz. Bağımlılıkları (Dependencies) gözden geçirmelisiniz. Primary-Foreign Key’lerin referans değerlerini kontrol etme işlemini atlamamalısınız. Daha sonra eski tabloyu tamamen veri tabanından çıkarabilirsiniz.
- Son alternatif yöntem ise tabloya kısmı delete atarak gerçekleştirebilirsiniz.
- Delete işleminde Where şartında Clustered Index tanımlı bir Column verirseniz silme işlemini daha hızlı gerçekleşecektir.
- Tablo üzerinde Index yoksa Where şartında kullanacağınız Column için Index tanımlamanız silme işlemini daha hızlı gerçekleştirecektir.
- Veritabanı Recovery modelini Single user moda alıp tüm Indexleri Droplayacaksınız. Varsa Triggerları Droplayacaksınız. En hızlı ve tutarlı silme işlemini bu şekilde gerçekleştirebilirsiniz. Süreç tamamlandığında tekrar Index ve Trigger’ları tanımlayarak sürece kaldığınız yerden devam edebilirsiniz.
Kısmi silme işlemleri ile alakalı Script’e aşağıdan erişebilirsiniz. Yeni yazıda görüşmek üzere.
set nocount on;
WHILE 1=1
BEGIN
DELETE TOP (10000)
FROM [database].[schema].[table] WITH(ROWLOCK)
WHERE FieldDate <'2020-01-01'
IF @@ROWCOUNT <10000 BREAK;
END
set nocount off;
Kaynaklar
Rto ve Rpo kavramları için tıklayınız.