Soru Tarihi:
Veri toplu güncellemesi, veri taşımaları, göçler ve iş mantığı düzeltmeleri sırasında ihtiyaç duyulur. Tipik bir örnek: çalışma tablosundaki on milyonlarca satırın durumunu değiştirmek, hizmeti durdurmadan, erişilebilirlik ve performansı koruyarak gereklidir.
Sorun:
Sınırlama olmaksızın standart UPDATE uzun sürer, kilitlerin tırmanmasına neden olabilir, tabloyu kilitler ve hata durumunda toplu geri alma sürecine yol açar. Kullanıcılar üzerinde minimum etki sağlamak ve işlem bütünlüğü sağlamak için bir yaklaşım gereklidir.
Çözüm:
Kod örneği:
-- 10.000 satır başına parti güncelleme örneği WHILE 1 = 1 BEGIN UPDATE TOP (10000) mytable SET status = 'archived', updated = GETDATE() WHERE status = 'active'; IF @@ROWCOUNT = 0 BREAK; END
Anahtar özellikler:
Tek bir işlemde toplu UPDATE yapmak ve tabloyu kilitlememek mümkün mü?
Genellikle hayır. Büyük bir işlem tablo / sayfayı kilitleyerek kilitlenme ve zaman aşımı riskini artırır. Partilerle çalışmak daha iyidir.
İndekslerin varlığı, toplu güncellemenin hızını etkiler mi?
Evet. İndekslenebilir alanların her birinin güncellenmesi, her satır için indeksin yeniden yapılandırılmasını gerektirir. Bazen indekslerin geçici olarak kaldırılması mantıklıdır, ancak bu derin bir analiz gerektirir.
Parti güncellemeleri atomik olarak tüm satırları mı günceller?
Hayır, atomiklik yalnızca bir partinin (satır/işlem sınırı) içindeki süreçle garanti edilir. Eğer parti kesilirse, bazı satırlar güncellenir, bazıları güncellenmez. Gerçek atomiklik için — tek bir işlemde tam bir UPDATE, bu da yüksek hacimlerde tehlikelidir.
Teknik mühendis, üretim veritabanında 10 milyon satırı tek bir sorguyla güncellemeye karar verdi: UPDATE mytable SET status = 'archived'. Site "dondu", geri alma işlemi on dakikalar sürdü, performans etkilendi.
Artılar:
Sorgu, 10.000 satırlık partilere bölünmüş, güncelleme; çalışma saatlerinde kesinti olmadan gerçekleşmiştir.
Artılar: