SQL Sessiz Temizlik öne çıkan görsel

Sessiz Temizlik: SQL Server’da Büyük Verilerle Zarif Mücadele

Kurumsal sistemlerde milyonlarca satır veriyle çalışan uygulamaların vazgeçilmez bileşeni olan SQL Server, zamanla büyüyen tablolar nedeniyle yönetimi zor hale gelebilir. Bu yazıda, devasa bir tabloyu silerek küçültmek isterken neden fark göremediğinizi ve nasıl fark ettirmeden, performans kaybına yol açmadan alan kazanabileceğinizi anlatacağız.

Ve evet, her şey bir damacana ve bir çay bardağıyla başlıyor.

Damacanadan Çay Bardağı Kadar Su Almak

Bir tablo düşünün: 80 milyon satır kayıt içeriyor. Siz bu tablodan 100.000 satır kayıt siliyorsunuz ama data space boyutu hic azalmıyor. Neden mi?

Bu durum, 19 litrelik bir damacanadan bir çay bardağı (100 ml) su almak gibidir. Damacana gözle görülür biçimde eksilmez. SQL Server da veri sildiğinizde fiziksel dosya boyutunu hemen küçültmez. Silinen alanlar “boş” olarak işaretlenir ama diskten silinmez. (Damacana boyutu da değişmez)

sql damacana su örneği görseli

SQL Server Veri Saklama Yapısı

SQL Server verileri 8 KB’lık veri sayfalarında tutar. Bu sayfalarda satırlar bulunur. Siz satır silince, sayfadaki yer “boş” hale gelir ama sayfa orada kalır. Sayfa tamamen boşalmazsa SQL Server onu fiziksel olarak diskten çıkarmaz.

Ayrıca tablonuzda clustered index yoksa (yani tablo bir heap ise), SQL Server sayfaları daha esnek kullanabilir. Ama bu, silme sonrası fiziksel boyutun hemen küçüleceği anlamına gelmez.

SQL Veri sayfaları görsel

Toplu Silme Neden Risklidir?

Bir gün içinde milyonlarca kaydı silmek:

  • Transaction log dosyasını şişirir,
  • Sistem kaynaklarını tüketir,
  • Lock’lar yaratır,
  • Hatta sistemin kitlenmesine neden olabilir.

Bu nedenle “sessiz ve parçalı silme” stratejisi gerekir.

En Doğru Yöntem: Sessiz, Kademeli Silme

Günlük gelen veri miktarı 300-400 bin kayıtsa ve sadece son 1 yılı saklamak istiyorsanız, eski verileri her gece küçük parçalar halinde silebilirsiniz.

 SQL Örnek: Batched Delete


DECLARE @BatchSize INT = 20000;

WHILE 1 = 1
BEGIN
    DELETE TOP (@BatchSize)
    FROM KayitTablosu
    WHERE Tarih < DATEADD(YEAR, -1, GETDATE());

    IF @@ROWCOUNT < @BatchSize
        BREAK;

    WAITFOR DELAY '00:00:02'; -- Sistem yorulmasın diye
END

Bu yapı, sistemin gözle görülür performans kaybı yaşamadan, arka planda veri temizliği yapmasını sağlar.

Ne Zaman Alan Kazanırsın?

Genel kural şudur:

Tablo boyutunun %10-15’i kadar veri silinmedikçe, data space fark edilir şekilde azalmaz.

83 milyonluk bir tabloda bu, yaklaşık 8 ila 12 milyon satır silindiğinde fark yaratmaya başlar. Bu seviyede silme olduğunda SQL Server sayfaları serbest bırakmaya başlar ve fiziksel alan kazanırsın.

Bonus: Gerçek Temizlik Nasıl Yapılır?

Kademeli silme sonrası fiziksel alan kazanmak istiyorsan:

Index’leri yeniden düzenle:

ALTER INDEX ALL ON KayitTablosu REORGANIZE;

Gerekiyorsa dosyayı küçült: (Nadiren yap, performans etkisi olabilir)

Son Söz: Damacanaya Güzelce Yaklaşmak

Silme işlemleri SQL Server’da göründüğü kadar doğrudan etki yaratmaz. Fark edilmeden, sessizce, parça parça ilerlemek en etkili ve sorunsuz yoldur.

Damacanadan bir çay bardağı alır gibi: az ama istikrarlı. Sistem yıpranmaz, siz kontrolü kaybetmezsiniz.

Bunlara Göz Atmak İsteyebilirsiniz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir