SQL'de büyük veri setlerini işlemek, bellek taşmasını, kilitlenmeleri önlemek ve istikrarlı performansı sağlamak için özel bir yaklaşım gerektirir. En önemli tekniklerden biri, işlemleri batch'lere ayırmaktır: giriş verileri küçük parçalar halinde işlenir, bu da sunucu üzerindeki yükü azaltır ve işlemleri ve hatalar durumunda geri almaları daha iyi kontrol etmeyi sağlar.
Anahtar unsurlar:
ROWCOUNT veya LIMIT / TOP)COMMIT, böylece işlem kaydını boşaltmakÖrnek (SQL Server):
DECLARE @BatchSize INT = 1000; WHILE 1 = 1 BEGIN BEGIN TRANSACTION; DELETE TOP(@BatchSize) FROM BigLogTable WHERE CreatedDate < '2021-01-01'; IF @@ROWCOUNT = 0 BREAK; COMMIT TRANSACTION; END
Bir büyük tablodan 100 milyon kaydı en az performans etkisiyle nasıl silebilirsiniz?
Yanlış cevap: "Tek büyük bir DELETE yapmak".
Doğru cevap: Batch'ler halinde, batch boyutunu kontrol ederek silmek, her bloğun ardından COMMIT yapmak, gerekiyorsa disk yükünü ve kilitlenmeleri azaltmak için beklemeler eklemek (WAITFOR DELAY veya benzeri).
Örnek (PostgreSQL):
DO $$ BEGIN LOOP DELETE FROM big_table WHERE created_at < NOW() - interval '1 year' LIMIT 10000; EXIT WHEN NOT FOUND; COMMIT; END LOOP; END$$;
Hikaye
Proje: Yüksek yüklü bir bankacılık servisi. Hata: Geliştirici, 80 milyon satırı tek büyük bir sorgu ile silmek için işlemi başlattı. Sonuç — işlem kaydı terabaytlara çıktı, tüm disk alanı tükendi, servis "çöktü".
Hikaye
Proje: Depo muhasebesine sahip bir e-ticaret mağazası. Hata: Kitlesel ekleme sırasında işlem boyutu sınırlandırılmadı. Büyük batch'lerin içe aktarımında kayıtlar hatalarla gitti, önceden yapılan tüm işler geri alınmak zorunda kaldı ve saatler yerine dakikalar aldı.
Hikaye
Proje: Perakendeci, sipariş detayları için raporlama veritabanı. Hata: Batch'leri kullandılar, ancak iterasyonlar arasında COMMIT'i unuttular — işlem kaydı üstel bir şekilde büyüdü, sunucu yavaşlamaya başladı ve ardından normal yöntemlerle kayıtların acil temizlenmesi gerekti.