Sql & Veritabanı İle Uygulamalar İçin Veri İyileştirme Temizliği Nasıl Yapılır?

Sql & Veritabanı İle Uygulamalar İçin Veri İyileştirme Temizliği Nasıl Yapılır?
Sql & Veritabanı İle Uygulamalar İçin Veri İyileştirme Temizliği Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu rehberdeki işlemler için PostgreSQL 16+ veya MySQL 8.4+ gibi modern bir ilişkisel veritabanı yönetim sistemi (RDBMS) kullanmanız önerilir. SQL standartları genel geçer olsa da, performans iyileştirmeleri için veritabanınızın güncel sürümde olması kritik öneme sahiptir.

  • Veritabanı Erişimi: Yönetici (admin) yetkilerine sahip bir veritabanı kullanıcısı.
  • Yedekleme: Herhangi bir temizlik işlemine başlamadan önce veritabanınızın tam yedeğini aldığınızdan emin olun.
  • SQL Editörü: DBeaver, pgAdmin veya MySQL Workbench gibi profesyonel bir veritabanı yönetim aracı.

Mükerrer Kayıtları Tespit Etme ve Temizleme

Veritabanı kirliliğinin en yaygın sebebi, aynı verinin birden fazla kez tabloya kaydedilmesidir. Mükerrer (duplicate) kayıtlar, raporlama hatalarına ve disk alanının gereksiz dolmasına yol açar. Öncelikle bu kayıtları tespit etmeliyiz.

Aşağıdaki sorgu, "users" tablosunda aynı e-posta adresine sahip birden fazla kullanıcı olup olmadığını belirler:

SELECT email, COUNT(*) 
FROM users 
GROUP BY email 
HAVING COUNT(*) > 1;

Bu sorgu, e-posta adresine göre gruplandırma yapar ve birden fazla kaydı olan e-postaları listeler. Tespit ettikten sonra, en eski kayıtları koruyup yenilerini silmek için bir "Common Table Expression" (CTE) yapısı kullanabilirsiniz.

WITH CTE AS (
    SELECT id, ROW_NUMBER() OVER (PARTITION BY email ORDER BY created_at ASC) as row_num
    FROM users
)
DELETE FROM users WHERE id IN (SELECT id FROM CTE WHERE row_num > 1);

Burada ROW_NUMBER() fonksiyonu, aynı e-postaya sahip satırları sıralar. 1'den büyük olan tüm satırlar mükerrer kabul edilerek silinir.

Veri Formatı İyileştirme ve Normalizasyon

Kullanıcıların formlara girdiği veriler genellikle tutarsızdır. Örneğin, telefon numaraları boşluklu, parantezli veya başında sıfır olmadan kaydedilmiş olabilir. Veri iyileştirme sürecinde bu formatları standart hale getirmelisiniz.

Aşağıdaki örnek, telefon numaralarındaki boşlukları ve özel karakterleri temizleyerek sadece rakamlardan oluşan bir format sağlar:

UPDATE users 
SET phone = REGEXP_REPLACE(phone, '[^0-9]', '', 'g')
WHERE phone ~ '[^0-9]';

Bu işlem, veritabanınızdaki tüm telefon numaralarını standart bir sayısal formata dönüştürür. Neden bunu yapıyoruz? Çünkü arama (search) ve filtreleme işlemlerinde "0532" ile "(532)" aynı veri olarak algılanmalıdır.

NULL Değerlerin Yönetimi ve Veri Bütünlüğü

NULL değerler, veritabanı sorgularında beklenmedik sonuçlara (örneğin COUNT(*) hataları) yol açabilir. Boş olan alanları varsayılan değerlerle doldurmak, uygulamanızın çalışma zamanı (runtime) hatalarını azaltır.

Aşağıdaki sorgu, "status" alanı boş olan kullanıcıları "inactive" olarak günceller:

UPDATE users 
SET status = 'inactive' 
WHERE status IS NULL;

Bu işlemden sonra, veritabanı şemanızı güncelleyerek bu alana NOT NULL kısıtlaması eklemek, gelecekte kirlilik oluşmasını engellemek için en iyi pratiktir.

Kritik Uyarı: Veritabanı üzerinde toplu güncelleme (UPDATE) veya silme (DELETE) işlemleri yapmadan önce mutlaka bir "Transaction" (işlem bloğu) kullanın. Hata durumunda ROLLBACK yaparak verilerinizi kurtarabilirsiniz.

Performans İçin İndekslerin Yeniden Yapılandırılması

Veri temizliği sadece kayıtları silmek değildir; aynı zamanda veritabanının veriyi okuma hızını artırmaktır. Gereksiz veya kullanılmayan indeksler, yazma (INSERT/UPDATE) işlemlerini yavaşlatır.

Kullanılmayan indeksleri tespit etmek için veritabanı istatistiklerini kontrol edebilirsiniz:

SELECT * FROM pg_stat_user_indexes 
WHERE idx_scan = 0;

Eğer bir indeks hiç kullanılmıyorsa (idx_scan = 0), bu indeksi silmek veritabanı performansınızı anında iyileştirecektir. İndeks silme işlemi için:

DROP INDEX index_name;

Veri İyileştirme Yöntemleri Karşılaştırma Tablosu

Yöntem Avantajı Dezavantajı
CTE ile Mükerrer Silme Hızlı ve güvenli Büyük verilerde geçici bellek kullanımı
REGEXP Temizliği Esnek format düzeltme İşlemci (CPU) yükü yüksek olabilir
İndeks Optimizasyonu Sorgu hızı artışı Yazma işlemlerinde hafif maliyet
Güvenlik Sorumluluk Reddi: Bu makalede paylaşılan SQL kodları genel eğitim amaçlıdır. Üretim (production) ortamında çalıştırmadan önce mutlaka test ortamında doğrulayın. Yanlış bir DELETE veya UPDATE sorgusu geri dönüşü olmayan veri kaybına neden olabilir.

Sıkça Sorulan Sorular

Veritabanı temizliği ne sıklıkla yapılmalıdır?

Veri yoğunluğuna bağlı olarak, küçük ölçekli projelerde üç ayda bir, yüksek trafikli projelerde ise aylık periyotlarla "veritabanı sağlığı" kontrolü yapılması önerilir.

SQL Injection nedir ve temizlik yaparken nasıl korunurum?

SQL Injection, dışarıdan gelen verilerin doğrudan sorguya dahil edilmesiyle oluşan bir güvenlik açığıdır. Temizlik scriptleri yazarken dinamik SQL yerine "Prepared Statements" (hazırlanmış ifadeler) kullanmalısınız.

Veritabanı temizliği sırasında uygulama durmalı mı?

Küçük temizlik işlemleri canlı sistemde yapılabilir ancak büyük tablo temizlikleri (milyonlarca satır) sırasında kilitlenmeleri (lock) önlemek için bakım moduna geçmek daha güvenlidir.

Hangi veriler "çöp" kabul edilir?

Kullanılmayan eski loglar, 6 aydan uzun süredir aktif olmayan kullanıcıların geçici verileri ve sistem tarafından oluşturulmuş ancak eşleşmesi olmayan (orphan) kayıtlar çöp veri kabul edilir.

Veritabanı temizliği SEO'yu etkiler mi?

Doğrudan etkilemez ancak veritabanı hızlandığı için sayfa yüklenme süreleriniz (LCP, TTFB) iyileşir. Bu da dolaylı olarak arama motoru sıralamalarınızı olumlu etkiler.

Veritabanı Temizliğinde Otomasyon ve Zamanlanmış Görevler (Cron Jobs)

Veri temizliği işlemleri manuel olarak yapıldığında hata payı yüksektir ve sürdürülebilir değildir. Büyük ölçekli veritabanlarında, temizlik süreçlerini veritabanı seviyesinde veya uygulama katmanında zamanlanmış görevlerle (Cron Jobs) otomatize etmek, sistemin her zaman "temiz" kalmasını sağlar.

SQL Server Agent ve PostgreSQL pg_cron Kullanımı

Veritabanı motorunuzun yerel özelliklerini kullanarak, belirli aralıklarla (örneğin her Pazar gece yarısı) eski logları veya geçici tabloları temizleyen prosedürler tanımlayabilirsiniz. Aşağıdaki örnek, PostgreSQL üzerinde 30 günden eski oturum verilerini silen bir pg_cron görevini temsil eder:

-- 30 günden eski log kayıtlarını her gece 03:00'te silen görev
SELECT cron.schedule('0 3 * * *', $$DELETE FROM system_logs WHERE created_at < NOW() - INTERVAL '30 days'$$);

-- İşlemin doğrulanması
SELECT * FROM cron.job;

Büyük Veri Setlerinde "Batch Processing" ile Güvenli Temizlik

Milyonlarca satır içeren bir tabloda tek bir DELETE sorgusu çalıştırmak, veritabanı log dosyalarınızın (Transaction Log) aşırı büyümesine ve tablonun kilitlenmesine (Locking) neden olabilir. Bu durumu engellemek için veriyi küçük parçalar halinde (Batch) silmek en güvenli yöntemdir.

Adım Adım Batch Silme Stratejisi

Aşağıdaki T-SQL örneği, veritabanını kilitlemeden 5000'lik paketler halinde temizlik işlemini gerçekleştiren bir döngü yapısını göstermektedir:

DECLARE @BatchSize INT = 5000;
DECLARE @RowsAffected INT = 1;

WHILE @RowsAffected > 0
BEGIN
    BEGIN TRANSACTION;
    
    DELETE TOP (@BatchSize) FROM Archive_Table 
    WHERE created_date < DATEADD(month, -6, GETDATE());
    
    SET @RowsAffected = @@ROWCOUNT;
    
    COMMIT TRANSACTION;
    
    -- İşlemler arasında kısa bir bekleme süresi (diğer sorguların çalışmasına izin verir)
    WAITFOR DELAY '00:00:01';
END;

Batch İşlemlerinin Avantajları:

  • Düşük Kaynak Tüketimi: İşlemci ve RAM üzerindeki ani yüklenme (spike) engellenir.
  • Transaction Log Yönetimi: Log dosyalarının dolması sonucu oluşabilecek "Disk Full" hatalarının önüne geçilir.
  • Sistem Erişilebilirliği: Tablo uzun süre kilitli kalmadığı için kullanıcılar uygulamayı kullanmaya devam edebilir.
Profesyonel İpucu: Büyük çaplı temizlik işlemlerini mutlaka veritabanı trafiğinin en düşük olduğu saatlerde (Off-peak hours) gerçekleştirin. Ayrıca, temizlik öncesi mutlaka bir "Full Backup" almayı ihmal etmeyin.

Sonuç

Sql & veritabanı ile uygulamalar için veri iyileştirme temizliği, sadece teknik bir görev değil, uygulamanızın sürdürülebilirliği için bir yatırımdır. Mükerrer kayıtları temizleyerek, veri formatlarını standartlaştırarak ve gereksiz indeksleri kaldırarak sisteminizin performansını 2026 standartlarına taşıyabilirsiniz. Bir sonraki adım olarak, veritabanı loglarını izleyen ve otomatik olarak eski verileri arşivleyen "Partitioning" (bölümleme) stratejilerini araştırmanızı öneririm.

Bu yazıya tepkinizi paylaşın:
Selin Korkmaz

Kendin yap (DIY) projeleri ve evde pratik tamirat üzerine uzmanım. Detaylı rehberlerimle herkesin teknik becerilerini geliştirmesini amaçlıyorum.

Yorumlar (0)

Yorum Yaz