SORU
13 Kasım 2008, PERŞEMBE


Nasıl SQL Server için büyük bir tablo için bir NOT NULL Sütun Ekle?

Çok sayıda kayıt içeren bir tablo için bir NOT NULL Sütun eklemek için, VARSAYILAN kısıtlama uygulanması gerekir. Bu kısıtlama tüm ALTER TABLE komutu uzun bir zaman eğer tablo çok büyük ise çalıştırmak için almaya neden oluyor. Bunun nedeni:

Varsayımlar:

  1. VARSAYILAN kısıtlama mevcut kayıtları değiştirir. Bu db veri sayfaları diğer veri sayfaları tam kaydını kaymasına neden olan her kayıt, boyutunu artırmak için ihtiyacı var demektir ve bu da zaman alır.
  2. VARSAYILAN güncelleştirme bir atomik işlem olarak çalıştırır. Bu bir günlük-geri böylece yetişkin olması için gereken işlem gerekirse idam anlamına gelir.
  3. İşlem kaydın tamamını izleyebilir oturum açın. Sadece tek bir alanı değiştirilmiş olsa bile, bu nedenle, alan günlük ihtiyaç duyduğu tüm kayıt çarpımına bağlı olacaktır # varolan kayıtları. Bu küçük kayıtları ile bir tablo için bir sütun eklenmesi halinde toplam # kayıtlarını her iki tablo için aynı olsa bile daha hızlı büyük kayıtları ile bir tablo için bir sütun ekleyerek daha olacağı anlamına gelir.

Olası çözümler:

  1. Kabullen ve işlemin tamamlanmasını bekleyin. Sadece emin olmak için çok uzun bir zaman aşımı süresi ayarlamak için. Bu sorun saat ya da gün bağlı olabileceği # kayıtları.
  2. Sütun Ekle ama BOŞ ver. Daha sonra, varolan satırlar için VARSAYILAN değeri ayarlamak için bir GÜNCELLEŞTİRME sorgusunu çalıştırın. GÜNCELLEME * yapmayın. Kayıt toplu güncelleme veya çözüm #1 aynı sorun ile bitireceğiz. Bu yaklaşım ile sorun, bu gereksiz bir seçenek olduğunu bildiğinizde NULL sağlayan bir sütun ile son buluyor. Gerekmedikçe BOŞ izin sütunları gerektiğini söyledi orada bazı iyi uygulama belgeleri olduğuna inanıyorum.
  3. Aynı şema ile yeni bir tablo oluşturun. Bu şema için sütun ekleyin. Verileri özgün tablodan Transfer. Orijinal tablo bırakma ve yeni tabloyu yeniden adlandırabilirsiniz. Bu daha iyi #1 Daha ne kadar emin değilim.

Soru:

  1. Benim varsayım doğru mu?
  2. Bu benim tek çözüm. Eğer öyleyse, hangisi en iyisidir? Ben ne yapabilirdim f değil mi?

CEVAP
19 Temmuz 2009, Pazar


İşim için bu sorunla da karşılaştım. Ve benim çözüm #2 birlikte.

Burada benim adım (SQL Server 2005 kullanıyorum):

1) varsayılan değeri tablosu için sütun Ekleyin:

ALTER TABLE MyTable ADD MyColumn varchar(40) DEFAULT('')

2) NOCHECK seçeneği NOT NULL kısıtlama Ekleme. NOCHECK mevcut değerler zorlamaz:

ALTER TABLE MyTable WITH NOCHECK
ADD CONSTRAINT MyColumn_NOTNULL CHECK (MyColumn IS NOT NULL)

3) değerleri kademeli olarak tabloda Güncelleme:

GO
UPDATE TOP(3000) MyTable SET MyColumn = '' WHERE MyColumn IS NULL
GO 1000
  • Update deyimi en fazla 3000 kayıtları güncellenir. Bu zamanda bir öbek veri kurtarmak için izin ver. "Sütunum BOŞ masama sıra birincil anahtar olmadığı için". kullanmak zorundayım

  • GO 1000 önceki deyimi 1000 kere çalıştırır. Bu daha sadece bu sayıyı artırmak istiyorsanız 3 milyon kayıtları güncellenir. UPDATE deyimi için SQL Server döndürür 0 Kayıt kadar çalıştırmaya devam edecek.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DanceOn

    DanceOn

    6 Mayıs 2006
  • hanksranger

    hanksranger

    6 EKİM 2009
  • Soulkiller13 ツ

    Soulkiller13

    30 Mayıs 2013