Po pierwsze: ile danych jest w tabeli? Liczba rzędów i rozmiar tabeli?
Po drugie: czy możesz wykonać kopię zapasową i przywrócić tę tabelę na serwerze testowym i uruchomić instrukcję alter, aby zobaczyć wpływ (zakładając, że nie jest to niewykonalne, ponieważ tabela jest zbyt duża, aby zmieściła się w systemie nieprodukcyjnym)? Zawsze uważam, że testowanie w moim środowisku jest dokładniejsze niż porady interwebs, ponieważ istnieje kilka czynników, które mogą wpłynąć na wynik, których nie można podać w pytaniu po prostu z powodu nieświadomości, że czynniki te mogą wpłynąć na wynik.
Po trzecie: zwiększenie wielkości pola o zmiennej długości jest (zakładając, że nie przekroczysz limitu 8060 bajtów) prostą operacją na metadanych, ponieważ dla takiej operacji nie zmieniłyby się żadne rzeczywiste dane. ALE, z drugiej strony, zmniejszenie wielkości pola o zmiennej długości, nawet do czegoś, co będzie bardziej niż oczywiste, nie jest prostą zmianą metadanych, ponieważ SQL Server nie wie przed skanowaniem wszystkich wierszy , że nowo żądany rozmiar jest prawidłowy.
Dlatego: Tak, to zablokuje tabelę na pewien czas . Ile czasu? Oto test, który właśnie wykonałem:
Miałem, z niektórych innych testów, tabelę z jednym INT NOT NULL
polem i milionem wierszy. Skopiowałem go do nowej tabeli w celu wykonania tego testu przez:
SELECT *, CONVERT(NVARCHAR(MAX), NEWID()) AS [StringField]
INTO dbo.ResizeTest
FROM dbo.ClusteredUnique;
W ten sposób zacząłem od podobnego scenariusza posiadania MAX
pola (właśnie zdałem sobie sprawę, że masz VARCHAR
i używam NVARCHAR
, ale to nie powinno zmienić zachowania, które widzę), na które mógłbym następnie zmienić 500
. I ma w sobie dane, które mogą łatwo zmieścić się w 500 znakach. Zajęło to kilka minut.
Potem pobiegłem:
ALTER TABLE dbo.ResizeTest ALTER COLUMN [StringField] NVARCHAR(500) NULL;
A to zajęło nieco ponad 11 minut.
Właśnie ponownie uruchomiłem test, tym razem upuszczając [ResizeTest]
stół i zmieniając oba NVARCHAR
s, aby były sprawiedliwe VARCHAR
, tylko dla pewności, że porównuję jabłka do czegoś, co przynajmniej wygląda jak jabłko ;-).
Początkowe utworzenie stołu zajęło 20 sekund, a ALTER TABLE
zajęło 2 minuty.
Tak więc, jeśli chodzi o szacowanie przestojów, jest to naprawdę trudne, ponieważ opiera się na prędkościach operacji we / wy dysku, niezależnie od tego, czy w pliku danych i / lub dzienniku transakcji muszą wystąpić jakiekolwiek operacje automatycznego wzrostu. jest prawdopodobnie dużą częścią tego, dlaczego mój pierwszy test zmienił się po 11 minutach, a drugi, mimo VARCHAR
że jest o połowę mniejszy od NVARCHAR
danych, zajął tylko 2 minuty (tj. pliki zostały wcześniej wyhodowane). Ale nadal należy pamiętać, że mój test jest uruchomiony na moim laptopie, który nie jest najszybszym dyskiem, ale był to również zaledwie milion wierszy z 2 małymi kolumnami (22 bajtów na wiersz).
A ponieważ zapytałeś, co zrobi ze stronami danych, oto twoja odpowiedź. Zrobiłem sp_spaceused
po utworzeniu tabeli, po zrobieniu ALTER COLUMN
i po zrobieniu ALTER TABLE dbo.ResizeTest REBUILD;
. Wyniki (następujące liczby są oparte na drugim teście VARCHAR
, a nie na pierwszym teście NVARCHAR
):
After initial table creation: 526,344 KB
After ALTER COLUMN VARCHAR(500): 1,031,688 KB <--- !! Yikes!!
After ALTER REBUILD: 526,472 KB
Jeśli obawiasz się, że operacja będzie możliwie najkrótsza, sprawdź artykuł, który napisałem na ten temat: Restrukturyzuj 100 milionów wierszy (lub więcej) tabel w kilka sekund. SRSLY! (wymagana darmowa rejestracja).
ALTER
ed każdą kolumnę kolejno - każde działanie niecały sekundy. Kiedy skończyli, stół podwoił rozmiar, ale kiedy zrobiłemREBUILD
(co było również operacją pod sekundą), stół wrócił do swojego pierwotnego rozmiaru.