Milyonlarca satır içeren bir tabloda sütun tanımını değiştirmenin en etkili yolu nedir?


9

Milyonlarca satır içeren bir tabloda DEĞİL NULL NULL bir sütun değiştirmek gerekiyor. Basit denedim

alter table Table1 ALTER COLUMN Column1 XML NULL

ama sonsuza dek sürüyor. Sorularım işte burada:

  1. Değişikliğin uygulanması neden bu kadar uzun sürüyor?
  2. Bunu yapmanın daha iyi bir yolu var mı?

Yanıtlar:


3

1) Neler olduğunu doğru bir şekilde anlamak için tablonun tüm yapısı + kümelenmemiş dizinler hakkında daha fazla bilgi gerekir, ancak şüphem NULL bitmap ile ilgili bir şeydir.

Konu hakkında daha fazla bilgi için lütfen başvurun. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Evet, depolama alanına sahip olmanız, doğru boşluğa sahip yeni bir tablo oluşturma ve aşırı günlük büyümesini önlemek için verileri çoklu gruplar halinde aktarma ve aşağıda listelenen tekniği kullanarak tabloyu değiştirme. Ben bunu çok az veya hiç kesinti ile birkaç kez yaptım.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html


6

Aşağıdakiler daha hızlı olur mu?

  1. Şunun için doğru tanımla yeni bir tablo oluşturun: Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. OriginalTable'ı OriginalTable_old olarak yeniden adlandırın; NewTable'ı OriginalTable olarak yeniden adlandır
  4. Orijinali Doğrula ve BırakTable_old

Buradaki avantaj, orijinal tablo üzerinde işlem süresince bir kilit tutmamanızdır. Tablo yalnızca yeniden adlandırma aşamasında kilitlenmelidir. (SQL Server'ın nesne düzeyinde yeniden adlandırmayı desteklediğini varsayar.)


Evet, SQL Server, sistem saklı yordamını kullanarak nesne düzeyi yeniden adlarını destekler sp_rename.
gonsalu

1 dakika içinde 3.5M satırları ile bu şekilde bir sütun değiştirebildim.
Mohsen Afshin

2

Sütunu NOT NULL yerine NULL olarak değiştirirken her satıra dokunulması gerekir, bu yüzden tamamlanması çok uzun sürer. Daha az zaman almasının bir yolu yok.


1

Başka bir seçenek, söz konusu tabloya doğru tanımlamalı yeni bir sütun oluşturmak, Sütunu eski sütundaki verilerle güncellemek ve ardından eski sütunu bırakmaktır.

Veya SE'den bir INT sütununda benzer bir sorunu ele alan eski bir gönderiye başvurabilirsiniz.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type


Benim durumumda, sütunum sadece NULL'larla doludur, bu yüzden bu yolun doğru yolla olacağını düşünüyorum, doğru adla yeni bir tamamen NULL sütun oluşturmak hiç zaman almamalıdır ... sonra eski sütunu silerek, milyonlarca
Zack

0

Komut çalışırken SQL etkinlik izleyicisini açarsanız, gerçekten işleyip işlemediğini veya tablonun bir tür özel kilidini bekleyip beklemediğini söyleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.