Azure SQL'de 18 milyon satırı uygulamayı durdurmadan silmek
Mitchel Sellers, S1 katmanındaki bir Azure SQL veritabanında 18 milyondan fazla geçmiş veriyi, küçük ve kontrollü batch'ler halinde silerek uygulamayı yavaşlatmadan nasıl temizlediğini anlatıyor. Yazı, batch boyutu, clustered key aralıkları ve destekleyici indeks seçimini ele alıyor. Büyük veri temizliklerini planlayan her .NET geliştiricisi için pratik bir rehber.
Kilit noktalar
- Büyük DELETE yerine sabit boyutlu batch'ler kullanın; yazarın değeri 25.000 satır ve yaklaşık 6 saniye aralıktı.
- Batch seçimini clustered key üzerinde sınırlı aralıklarla yapın ve checkpoint'i incelenen aralığa göre ilerletin.
- Tarih koşulu için destekleyici bir indeks gerekip gerekmediğini gerçek execution plan ve logical reads ile doğrulayın.
- CPU, data I/O, log I/O, kilitlenme ve batch süresini izleyin; eşik aşılırsa batch boyutunu düşürün veya duraklatın.
- Temizlik sonrası fragmentasyonu tek başına yüzdeye bakarak değil, page density ve sorgu performansıyla birlikte değerlendirin.
- Silme işini bir kez yapılan bir operasyon değil, düzenli çalışan ve izlenen bir retention süreci haline getirin.
Yazar, S1 katmanındaki bir Azure SQL veritabanından 18 milyondan fazla geçmiş aktivite kaydını silmek zorunda kaldı. Tek bir büyük DELETE ifadesi işlem logunu şişirecek, uzun süre kilit tutacak ve uygulamayla aynı kaynakları paylaşacaktı. Bu nedenle çözüm, her seferinde yaklaşık 25.000 satırlık, commit edilen batch'lerle ilerlemek oldu. Yaklaşık altı saniyede bir çalışan bu yaklaşım, daha agresif denemelere göre daha öngörülebilir ve veritabanını zorlamayan bir ilerleme sağladı.
Kritik nokta, silme sorgusunun tabloyu her seferinde baştan taramamasıdır. Yazar, işlemi clustered key üzerinde sınırlı aralıklarla yapıyor ve checkpoint değerini gerçekte incelenen aralığa göre ilerletiyor. Tarih koşulu için uygun bir indeks de gerekebilir, ancak bu indeks yazma maliyetini artırır. Ayrıca CPU, I/O, log baskısı ve uygulama gecikmesi izlenmeli; temizlik sonrasında indeks fragmentasyonu da değerlendirilmelidir.
Gerçek dünyada kullanımı
- Azure SQL S1 gibi sınırlı bir katmanı başka uygulamalarla paylaşan bir SaaS veritabanında eski log veya aktivite kayıtlarını temizlemek.
- Yıllardır büyüyen bir tablodan retention kuralına göre geçmiş verileri, kullanıcı trafiğini bozmadan arka plan işi olarak silmek.
- Entity Framework Core ile yazılmış bir worker servisinde toplu silme işini checkpoint'li ve iptal edilebilir şekilde çalıştırmak.
Neden önemli
Büyük bir silme işlemini tek seferde çalıştırmak yerine kontrollü batch'lere bölmek, kilit süresini, log şişmesini ve uygulama gecikmesini azaltır. Ayrıca retention'ı düzenli bir süreç olarak kurmak, bir sonraki büyük temizlik ihtiyacını ortadan kaldırır.