Veri arşivleme, büyük tablolara sahip yüksek trafikli OLTP sistemleri için en önemli görevlerden biridir. Tarihsel olarak, bunu gerçekleştirmek için yapılan ilk denemeler oldukça basitti: veriler manuel olarak skriptler veya uygulamalar aracılığıyla ayrı tablolara silinir veya kopyalanırdı. Daha sonra, ana veritabanının işleyişine minimum etkiyle işlem bütünlüğünü sağlayan daha sistematik yaklaşımlar ortaya çıktı.
Burada sorun, yalnızca bilgilerin fiziksel taşınmasında değil, aynı zamanda tutarlılığın korunmasında, blokajların en aza indirilmesinde ve yüksek performansın sağlanmasındadır. Arşivleme hataları veri kaybına, kullanıcıların engellenmesine veya önemli bir yük artışına yol açabilir.
Çözüm, işlem kontrolü ile toplu işlemlerin kullanılmasını ve aynı yapıya sahip özel arşiv tablolarının oluşturulmasını veya görev zamanlayıcıları ve prosedürler aracılığıyla otomasyonu içermektedir.
Kod örneği:
-- Bir yıldan eski 5000 kaydı arşiv tablosuna taşıyoruz. INSERT INTO archive_orders SELECT * FROM orders WHERE order_date < DATEADD(year, -1, GETDATE()) AND id IN (SELECT TOP 5000 id FROM orders WHERE order_date < DATEADD(year, -1, GETDATE()) ORDER BY id); DELETE FROM orders WHERE id IN (SELECT TOP 5000 id FROM orders WHERE order_date < DATEADD(year, -1, GETDATE()) ORDER BY id);
Anahtar özellikler:
Eski kayıtların topluca silinmesi durumunda hangi riskler vardır ve nasıl önlenir?
Toplu DELETE, kilitlerin yükselmesine ve veritabanının genel işleyişinin yavaşlamasına neden olabilir. Bu, silmenin küçük parçalar halinde veya LIMIT/TOP kullanılarak gerçekleştirilmesiyle önlenebilir, eğer veritabanı yönetim sistemi (DBMS) bunu destekliyorsa.
WHILE 1=1 BEGIN DELETE TOP (1000) FROM orders WHERE order_date < '2023-01-01'; IF @@ROWCOUNT = 0 BREAK; END
Arşivlenecek verileri silmek için TRUNCATE kullanılabilir mi?
TRUNCATE, tablodaki tüm satırları siler ve belirli satırların koşullu olarak temizlenmesi için uygun değildir. Tetikleyicileri çağırmaz, WHERE desteklemez ve yalnızca tamamen temizleme için kullanılır, seçici arşivleme için değil.
Silme ve ekleme işlemleri farklı işlemlerde yapıldığında, taşımanın doğru yapıldığını nasıl garanti edebilirim?
Satırın bir işlemde taşınması daha iyidir: önce arşive kopyalayın, ardından ana tablodan silin. Aksi takdirde, işlemler arasında bir hata durumunda tutarsızlıkla karşılaşabilirsiniz.
BEGIN TRANSACTION INSERT INTO archive_orders SELECT * FROM orders WHERE ... DELETE FROM orders WHERE ... COMMIT
Bir mühendis, çalışma saatleri içinde DELETE FROM logs WHERE event_date < '2022-01-01' sorgusunu bir milyon kayıt için çalıştırır.
Artılar:
Eksiler:
Gece, başarıyla taşınan her bir bölüm için kayıt tutma ile birlikte, 5000 satırlık taşımayı programlamak için saklanan bir prosedür ve zamanlanmış görev kullanılır.
Artılar:
Eksiler: