İlk önce: Tabloda ne kadar veri var? Satır sayısı ve tablonun boyutu?
İkincisi: Bu tabloyu yedekleyip bir test sunucusuna geri yükleyebilir ve etkiyi görmek için alter deyimini çalıştırabilir misiniz (tablonun Üretim dışı bir sisteme sığmayacak kadar büyük olması nedeniyle mümkün olmadığı varsayılarak)? Her zaman çevremde test etmenin internetler arası tavsiyeden daha doğru olduğunu görüyorum, çünkü sadece bu faktörlerin sonucu etkileyebileceğini bilmemesi nedeniyle soruda sağlanamayan sonucu etkileyebilecek çeşitli faktörler vardır.
Üçüncüsü: artan değişken uzunlukta alanının boyutunu olan hiçbir gerçek veri böyle bir operasyon için değişen olacağından basit meta veri işlemi (eğer üzerinde 8060 bayt sınırı gitmez varsayarak). ANCAK, diğer taraftan, indirgeyici bir değişken uzunlukta alanının boyutunu, hatta, daha açıkçası işin daha kalacak bir şekilde değil tüm satırları tarayarak önce SQL Server bilmediği için basit bir meta veri değişimi, , yeni istenen boyutun geçerli olduğunu belirtir.
Dolayısıyla: Evet, bu masayı bir süre kilitleyecektir . Ne kadar zaman? İşte yeni yaptığım test:
Diğer bazı testlerden, tek bir INT NOT NULL
alana ve 1 milyon sıraya sahip bir masam vardı . Bu testi yapmak için yeni bir tabloya kopyaladım:
SELECT *, CONVERT(NVARCHAR(MAX), NEWID()) AS [StringField]
INTO dbo.ResizeTest
FROM dbo.ClusteredUnique;
Bu şekilde, daha sonra değiştirebileceğim bir MAX
alanın (sadece sahip olduğunuzu VARCHAR
ve kullandığımı fark ettim NVARCHAR
, ancak bu gördüğüm davranışı değiştirmemeliydim) sahip olmak için benzer bir senaryo ile başlıyordum 500
. İçinde 500 karaktere kolayca sığabilen veriler var. Birkaç dakika sürdü.
Sonra koştum:
ALTER TABLE dbo.ResizeTest ALTER COLUMN [StringField] NVARCHAR(500) NULL;
Ve bu 11 dakikadan biraz fazla sürdü.
Testi tekrar tekrar çalıştırdım, bu sefer [ResizeTest]
masayı bırakarak ve her ikisini NVARCHAR
de sadece VARCHAR
en azından bir elma ;-) gibi görünen bir şeyle karşılaştırdığımdan emin olmak için, sadece s olarak değiştiriyorum .
İlk tablo oluşturma işlemi 20 saniye sürerken ALTER TABLE
2 dakika sürdü.
Bu nedenle, kesinti süresini tahmin etmek için, veri dosyasında ve / veya işlem günlüğünde vb. Herhangi bir otomatik büyüme işleminin olması gerekip gerekmediği disk G / Ç hızlarına bağlı olduğu için bunu yapmak gerçekten zordur. Muhtemelen ilk testimin değiştirilmesinin 11 dakika sürdüğünün büyük bir kısmı ve ikincisi, verilerin VARCHAR
yarısı boyutunda olsa bile NVARCHAR
, sadece 2 dakika sürdü (yani dosyalar bu noktada önceden oluşturuldu). Ancak yine de, testimin en hızlı disk olmayan dizüstü bilgisayarımda çalıştığını, ancak aynı zamanda sadece 1 milyon satır 2 küçük sütunun (satır başına 22 veya bayt) olduğunu unutmayın.
Ve veri sayfalarına ne yapacağını sorduğunuzdan, işte cevabınız. sp_spaceused
Masayı oluşturduktan sonra, yaptıktan sonra ALTER COLUMN
ve yaptıktan sonra yaptım ALTER TABLE dbo.ResizeTest REBUILD;
. Sonuçlar (aşağıdaki sayılar VARCHAR
ilk testi değil, ikinci testi temel alır NVARCHAR
):
After initial table creation: 526,344 KB
After ALTER COLUMN VARCHAR(500): 1,031,688 KB <--- !! Yikes!!
After ALTER REBUILD: 526,472 KB
İşlemi mümkün olan en kısa süre içinde tutmaya ihtiyaç duyduğunuzdan endişe ediyorsanız, aşağıdakileri yaptığım hakkında yazdığım bir makaleye göz atın : 100 Milyon Satır (veya daha fazla) Tabloyu Saniyede Yeniden Yapılandırın. SRSLY! (ücretsiz kayıt gereklidir).
ALTER
arka arkaya, her sütun ed - her bir eylem, bir saniyeden daha az aldı. Yapıldıkları zaman, tablonun boyutu iki katına çıkmıştı, ancak bir kezREBUILD
(ki ikinci bir işlemdi) yaptığımda , masa orijinal boyutuna geri döndü.