Czy przy zwiększaniu rozmiaru kolumny VARCHAR na dużym stole mogą wystąpić jakieś problemy?


87

Używam SQL Server 2008 i muszę powiększyć pole VARCHAR, od (200 do 1200) w tabeli zawierającej około 500 tys. Wierszy. Muszę wiedzieć, czy są jakieś problemy, których nie brałem pod uwagę.

Będę używać tego oświadczenia TSQL:

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

Wypróbowałem już to na kopii danych i to stwierdzenie nie miało żadnych złych skutków, które widziałem.

Czy są więc jakieś problemy, których mogłem nie wziąć pod uwagę?

Nawiasem mówiąc, kolumna nie jest indeksowana.


1
@nonnb: to okropny pomysł. stackoverflow.com/q/2091284/27535
gbn

@gbn Jakieś przemyślenia na temat ostatniej odpowiedzi Justina na to pytanie? Wygląda na to, że jest w sprzeczności z twoim.
AakashM

@AakashM: ma rację co do przechowywania, ale jest to narzut, a nie optymalizacja. A teraz przeczytaj ten stackoverflow.com/q/2009694/27535
pl

@gbn - słuszna uwaga, podobnie jak obserwacja Martina Smitha na temat indeksowania. Wycofane.
StuartLC

2
Okazało się, że w końcu był jeden haczyk! Pole zostało zindeksowane, a gdy ktoś próbował wprowadzić wpis większy niż 900b, nie udało się! Być ostrzeżonym.
Paul T Davies

Odpowiedzi:


59

To jest tylko zmiana metadanych: jest szybka.

Spostrzeżenie: jawnie określ NULL lub NOT NULL, aby uniknąć „wypadków”, jeśli jedno z ustawień SET ANSI_xx jest inne np. Z jakiegoś powodu uruchom w osql, a nie SSMS


1
Wszystko poszło dobrze z tym. Bez problemów.
Paul T Davies

Czy wiesz, czy podczas podróży z varchar(200)do obowiązują te same zasady varchar(max)?
CodeNaked

@CodeNaked: odpowiedź na to pytanie jest znacznie trudniejsza. (max) to typ LOB, który może znajdować się „w rzędzie” lub poza wierszem. Jednak jestem skłonny powiedzieć, że powinno być tak samo, ponieważ dane są już „w wierszu” i nie będzie potrzebna odbudowa tabeli
gbn

12

Chciałem tylko dodać moje 2 centy, ponieważ wygooglowałem to pytanie b / c znalazłem się w podobnej sytuacji ...

PAMIĘTAJ, że zmiana z varchar(xxx)na varchar(yyy)to rzeczywiście zmiana metadanych, ale zmiana na varchar(max)nie. Ponieważ varchar(max)wartości (znane również jako wartości BLOB - obraz / tekst itp.) Są przechowywane na dysku inaczej, nie w wierszu tabeli, ale „poza wierszem”. Więc serwer zwariuje na dużym stole i przestanie odpowiadać przez kilka minut (godzin).

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

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

PS. to samo dotyczy nvarcharlub oczywiście.


4

Zmiana na Varchar (1200) z Varchar (200) nie powinna spowodować żadnego problemu, ponieważ jest to tylko zmiana metadanych, a ponieważ SQL Server 2008 obcina nadmierne puste miejsca, nie powinno być również żadnych różnic w wydajności, więc w skrócie nie powinno być problemów z tworzeniem zmiana.


Uważam, że może to być prawdą w przypadku małych tabel, ale w przypadku dużych tabel, które są aktywnie odpytywane, może to blokować się przez znaczną ilość czasu (ponieważ serwer SQL musi sprawdzić, czy musi obciąć każdy wiersz).
CodeNaked

0

Innym powodem, dla którego powinieneś unikać konwersji kolumny na varchar (max), jest to, że nie możesz utworzyć indeksu w kolumnie varchar (max).


-3

W moim przypadku kolumna alter nie działała, więc można użyć polecenia `` Modyfikuj '', na przykład:

alter table [nazwa_tabeli] MODIFY kolumna [nazwa_kolumny] varchar (1200);


5
To dlatego, że nie używasz SQL Server na pytanie (ale prawdopodobnie MySQL). „ALTER TABLE ... MODIFY” nie jest poprawnym językiem T-SQL.
Jeroen Mostert
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.