ProgramlamaBackend geliştirici

Yüksek trafikli bir tablodan eski verilerin ayrı bir depolama alanına etkili bir şekilde arşivlenmesi ve taşınması nasıl gerçekleştirilir? Hangi yaklaşımlar, sorunlar ve optimum çözümler vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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 verilerin toplu olarak taşınmasıyla yükün azaltılması.
  • İşlemlerin eklenmesi ve silinmesi üzerinde işlemlerle tutarlılık sağlanması.
  • Görevlerin zamanlaması ve prosedürler aracılığıyla otomasyon planlaması.

Tuzağa düşüren sorular.

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

Yaygın hatalar ve anti-patönler

  • Büyük veri setlerinin tek bir sorguyla silinmesi, kilitlenmelere neden olur.
  • Arşivleme işleminde tüm satırların gerçekten taşındığını kontrol etmeden yapmak.
  • DELETE yerine TRUNCATE kullanılması — bu, tablodaki tüm verilerin kaybına yol açar.

Hayat örneği

Olumsuz vaka

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:

  • Script basit

Eksiler:

  • Tüm tablo kilitlenir, kullanıcılar çalışamaz, işlem saatler sürer, yedek olmadan geri alınamaz.

Olumlu vaka

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:

  • Minimum kilitlenme
  • Eylem kaydı
  • Hata sayısının kontrolü

Eksiler:

  • Prosedürlerin hazırlanması ve periyodik kontrol gerektirir.