Minimum kesinti süresi olan büyük bir tabloya nasıl satır çevirme sütunu ekleyebilirim


21

SQL Server 2008 ve sonraki sürümlerini kullanarak, büyük bir tabloya bir rowversion sütunu eklemek istiyorum ancak

ALTER TABLE [Tablename]
ADD Rowversion [Rowversion] NOT NULL

Daha sonra tablo güncellemeler için çok uzun süre kullanılamaz.

Bu kesinti süresini azaltmak için hangi stratejileri kullanabilirim? Ben bir şey düşüneceğim. Ne kadar basit olursa o kadar iyi olur, ama herhangi bir stratejiyi ele alacağım.

Benim düşüncem, son çare olarak, tetikleyiciler tarafından tutulan bir kopya aşamalandırma tablosunu koruyabilir ve daha sonra hazırlama tablosunu orijinal tabloya sp_rename edebilirim. Ama daha basit / daha kolay bir şey umuyorum.

Yanıtlar:


26

Aynı şema artı rowversion sütununa sahip yeni bir tablo oluşturmayı ve her birini birleştiren her iki tablonun üstüne bir görünüm eklemeyi düşünün. Kişilerin görünümü kullanmasını sağlayın ve bunun yerine alttaki tablolara ve görünümlere karşı tetikleyiciler yazın.

Ekler yeni tabloya gönderilmeli, güncellemeler verileri yeni tabloya taşımalı ve silmeler her iki tabloya da uygulanmalıdır.

Ardından, arka planda toplu hareketler yapın ve yeni tabloya olabildiğince çok sayıda kayıt taşıyın. Bu devam ederken eşzamanlılık sorunları yaşayabilirsiniz ve bazı zahmetli yürütme planları, ancak hamleler yapılırken çevrimiçi kalmanızı sağlar.

İdeal olarak, son kullanıcılar üzerindeki etkiyi en aza indirmek için bir Cuma öğleden sonra işleme başlar ve Pazartesi sabahından önce yapmaya çalışırsınız. Yerleştirildikten sonra, görünümü yalnızca yeni tabloya işaret edecek şekilde değiştirebilirsiniz ve boktan yürütme planları kaybolur. İdeal.

Veriler toplu olarak taşınırken tetikleyicilerin tetiklenmesini önlemek için, tetikleyicideki silinen / eklenen tablolardaki satır sayısına bakın ve toplu işinizdeki satır sayısına yakınsa etkinlikleri atlayın.


Sonunda, Michael daha istikrarlı planlar elde etmek için görünümü atlamaya (ve orijinal tablodan silmemeye) karar verdi. Takas, esasen tablonun iki kopyasını tutuyordu. Bir dizi blog yayınına dönüştürdü .


7

Önceden plan yapmak için zamanınız varsa, çok daha kolay bir çözüm var ... (genellikle)

Uzun kilitler neredeyse kesinlikle depolama katmanındaki sayfa bölünmelerinden kaynaklanır. Bu yüzden onları kendi programınıza göre zorlayın.

  1. Veri türü ile NULL özellikli geçici bir sütun ekleyin VARBINARY(8).
  2. Mevcut kayıtların yığınlarını alan için geçerli bir değerle güncellemek için veritabanındaki boş zamanı bulun. ( 0x0000000027F95A5Börneğin)
  3. Güncellemeler, gerekli sayfa bölünmelerini zorlar ve tabloya daha fazla alan ayırır.
  4. Yakalandığınızda geçici sütunu bırakın (ayrılan depolama alanına dokunmaz) ve satır çevirme sütununu ekleyin.
  5. Sayfa bölünmesi yok ve değerleri doldurmak için yalnızca yeterince uzun bir kilit gerekli.

Bunu, 10 dakikadan kısa bir sürede 150 milyonluk bir satır tablosuna bir rowversion sütunu eklemek için başarıyla kullandım.

Uyarı ... büyük varchar alanlarına sahip bir tablonuz varsa (özellikle varchar(max)) SQL Server, yeni kullanılabilir alanı yeniden kullanmak yerine tabloyu yeniden oluşturmaya karar verir. Hala bunun etrafında bir yol bulmaya çalışıyorum.


İlginç, sanırım sorumda "çok uzun" ne anlama geldiğini belirtmedim. Senaryonuz için> 30 dakika çok uzunsa ve 10 dakika tolere edilebilirse, bu çözüm işe yarayacaktır. Senaryom, Brent'in cevabı ile sıfır kesinti veya daha spesifik olarak <10 saniye elde etmeye çalışmaktı.
Michael J Swart

1

Eğer TIMESTAMPeklediğiniz olduğunu NULLABLE:

  1. VARBINARY(8)Sütun ekle
  2. Verilerle doldurun.

O doldurulur sonra geri SQL ifadelerine arka, kolon Yeni eklediğiniz ve doldurulan ve eklemek sütun.DROPVARBINARY(8)TIMESTAMP NULL


Eğer TIMESTAMPeklediğiniz olduğunu NOT NULLABLE:

  1. BINARY(8)Sütun ekle
  2. Verilerle doldurun.

O doldurulur sonra geri SQL ifadelerine arka, sütun önce eklediğiniz ve doldurulan ve sütun.DROPBINARY(8)ADD THE TIMESTAMP NOT NULL

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.