"En iyi" bir cevabım yok, ama işleri hızlı bir şekilde halletmeni sağlayacak "en az kötü" bir cevabım var.
Masamda 2MM satır vardı ve ilkine varsayılan olan ikincil bir zaman damgası sütunu eklemeye çalıştığımda güncelleme performansı düşüyordu.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
40 dakika bekledikten sonra, bunun ne kadar süreceği konusunda bir fikir edinmek için küçük bir parti üzerinde denedim - tahmin 8 saat kadar sürdü.
Kabul edilen cevap kesinlikle daha iyi - ancak bu tablo veritabanımda yoğun bir şekilde kullanılıyor. Üzerinde FKEY bulunan birkaç düzine masa var; YABANCI ANAHTARLARI pek çok masaya değiştirmek istemiyorum. Ve sonra görüşler var.
Biraz belge, vaka çalışması ve StackOverflow araştırıyor ve "A-Ha!" an. Drenaj çekirdek GÜNCELLEME'de değil, tüm INDEX işlemlerinde. Masamın üzerinde 12 dizin var - birkaçı kısıtlamalar, birkaçı sorgu planlayıcısını hızlandırmak ve birkaçı da tam metin araması için.
GÜNCELLEME olan her satır sadece bir DELETE / INSERT üzerinde çalışmakla kalmayıp, aynı zamanda her bir dizini değiştirmenin ve kısıtlamaları kontrol etmenin ek yüküdür.
Benim çözümüm her dizini ve kısıtlamayı bırakmak, tabloyu güncellemek ve ardından tüm dizinleri / kısıtlamaları tekrar eklemek oldu.
Aşağıdakileri yapan bir SQL işlemi yazmak yaklaşık 3 dakika sürdü:
- BAŞLA;
- bırakılan endeksler / sabitler
- güncelleme tablosu
- dizinleri / kısıtlamaları yeniden ekleyin
- COMMIT;
Senaryonun çalışması 7 dakika sürdü.
Kabul edilen cevap kesinlikle daha iyi ve daha doğrudur ... ve kesinti süresi ihtiyacını ortadan kaldırır. Benim durumumda, bu çözümü kullanmak için önemli ölçüde daha fazla "Geliştirici" çalışması olurdu ve bunun gerçekleştirilebilmesi için 30 dakikalık bir planlı kapalı kalma süresi vardı. Çözümümüz 10'da ele alındı.
ALTER TABLE .. ADD COLUMN ...
yoksa cevaplanacak kısım mı?