Büyük bir tabloda VARCHAR sütununun boyutunu artırırken herhangi bir sorun olabilir mi?


87

SQL Server 2008 kullanıyorum ve yaklaşık 500 bin satırlık bir tabloda bir VARCHAR alanını (200'den 1200'e) büyütmem gerekiyor. Bilmem gereken şey, dikkate almadığım sorunlar olup olmadığıdır.

Bu TSQL ifadesini kullanacağım:

ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)

Bunu zaten verilerin bir kopyası üzerinde denedim ve bu ifadenin görebildiğim kadarıyla hiçbir kötü etkisi olmadı.

Öyleyse, bunu yaparken düşünmemiş olabileceğim olası sorunlar var mı?

Bu arada, sütun indekslenmemiş.


1
@nonnb: Bu berbat bir fikir. stackoverflow.com/q/2091284/27535
gbn

@gbn Justin'in bu soruya verdiği son yanıt hakkında herhangi bir fikriniz var mı? Sizinki ile bir şekilde çelişiyor gibi görünüyor.
AakashM

@AakashM: Depolama konusunda haklı ama bu bir optimizasyon değil ek yük. Şimdi bu stackoverflow.com/q/2009694/27535'i
gbn

@gbn - Martin Smith'in indeksleme konusundaki gözlemi gibi iyi bir nokta. Geri çekildi.
StuartLC

2
Sonunda bir tane aldatma olduğu ortaya çıktı! Alan indekslendi ve biri 900b'den büyük bir giriş girmeye çalıştığında başarısız oldu! Dikkatli olun.
Paul T Davies

Yanıtlar:


59

Bu yalnızca bir meta veri değişikliğidir: hızlıdır.

Bir gözlem: SET ANSI_xx ayarlarından biri farklıysa "kazaları" önlemek için açıkça NULL veya NOT NULL belirtin, örneğin osql'de çalıştırın, herhangi bir nedenle SSMS değil


1
Bununla her şey yolunda gitti. Sorun yok.
Paul T Davies

Bir yerden varchar(200)diğerine giderken aynı kuralların geçerli olup olmadığını biliyor musunuz varchar(max)?
CodeNaked

@CodeNaked: Bu, cevaplaması çok daha zor. (max), "satır içinde" veya satır dışında olabilen bir LOB türüdür. Bununla birlikte, aynı olması gerektiğini söylemeye meyilliyim çünkü veriler zaten "sıralı" ve tablonun yeniden oluşturulması gerekmiyor
gbn

12

Sadece 2 sentimi eklemek istedim, çünkü bu soruyu googledim, çünkü kendimi benzer bir durumda buldum ...

FARKINDA OLMAK gelen değiştirirken o varchar(xxx)kadar varchar(yyy)gerçekten meta veri değişim olmakla birlikte, değişen varchar(max)değildir. Çünkü varchar(max)değerler (diğer adıyla BLOB değerleri - resim / metin vb.) Diskte farklı şekilde depolanır, bir tablo satırı içinde değil, "satır dışı". Böylece sunucu büyük bir masada çıldıracak ve dakikalar (saatler) boyunca tepkisiz hale gelecektir.

--no downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200)

--huge downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max)

PS. aynı şey nvarcharveya tabii ki için de geçerlidir .


4

Varchar (200) 'dan Varchar (1200)' e geçiş, yalnızca bir meta veri değişikliği olduğundan ve SQL server 2008 aşırı boş alanları kestiği için hiçbir sorun yaşamamanıza neden olacaktır, bu nedenle kısacası, değişiklik.


Bunun küçük tablolar için doğru olabileceğine inanıyorum, ancak aktif olarak sorgulanan büyük tablolar için bu önemli bir süre engelleyebilir (çünkü SQL sunucusunun her satırı kesmesi gerekip gerekmediğini görmesi gerekir).
CodeNaked

0

Sütunu varchar (max) 'a dönüştürmekten kaçınmanızın bir başka nedeni de varchar (max) sütununda bir dizin oluşturamamanızdır.


-3

Benim durumumda değişiklik sütunu çalışmıyordu, bu nedenle 'Değiştir' komutunu kullanabilirsiniz, örneğin:

tabloyu değiştir [tablo_adı] DEĞİŞTİR sütun [sütun_adı] varchar (1200);


5
Bunun nedeni, soru başına SQL Server kullanmamanızdır (ancak muhtemelen MySQL). "ALTER TABLE ... MODIFY" geçerli T-SQL değil.
Jeroen Mostert
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.