Jaki jest najbardziej efektywny sposób zmiany definicji kolumny w tabeli z milionami wierszy


9

Muszę zmienić kolumnę z NOT NULL na NULL w tabeli zawierającej miliony wierszy. Próbowałem prosty

alter table Table1 ALTER COLUMN Column1 XML NULL

ale to trwa wiecznie. Oto moje pytania:

  1. Dlaczego tak długo trwa modyfikacja?
  2. Czy jest na to lepszy sposób?

Odpowiedzi:


3

1) Potrzebne byłyby więcej informacji na temat całej struktury tabeli + indeksy nieklastrowane, aby poprawnie zorientować się, co się dzieje, ale moje podejrzenie ma związek z bitmapą NULL.

Więcej informacji na ten temat można znaleźć w. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Tak, pod warunkiem, że masz miejsce do przechowywania, utwórz nową tabelę z prawidłową zerowalnością i przenieś dane w wielu partiach, aby uniknąć nadmiernego wzrostu dzienników, i przełącz tabelę przy użyciu techniki wymienionej poniżej. Zrobiłem to kilka razy, bez żadnych przestojów lub wcale.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html


6

Czy byłoby szybciej:

  1. Utwórz nową tabelę z poprawną definicją dla Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Zmień nazwę OriginalTable na OriginalTable_old; Zmień nazwę NewTable na OriginalTable
  4. Sprawdź poprawność i upuść OriginalTable_old

Zaletą jest to, że nie przytrzymujesz blokady oryginalnego stołu na czas operacji. Tabela powinna być zablokowana tylko podczas fazy zmiany nazwy. (Zakłada się, że SQL Server obsługuje zmianę nazwy obiektu).


Tak, SQL Server obsługuje zmiany nazw na poziomie obiektu przy użyciu systemowej procedury składowanej sp_rename.
gonsalu

W ten sposób mogłem zmienić kolumnę za pomocą 3,5 mln wierszy w ciągu 1 minuty.
Mohsen Afshin

2

Podczas zmiany kolumny z NOT NULL na NULL należy dotknąć każdego wiersza, dlatego wypełnienie zajmuje tyle czasu. Nie ma sposobu, aby zajęło to mniej czasu.


1

Inną opcją jest utworzenie nowej kolumny z poprawną definicją do danej tabeli, zaktualizuj kolumnę danymi ze starej kolumny, a następnie upuść starą kolumnę.

Lub Możesz odnieść się do starszego postu z SE, który dotyczy podobnego problemu w kolumnie INT.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type


W moim przypadku moja kolumna jest po prostu pełna wartości NULL, więc myślę, że to byłaby właściwa droga, utworzenie nowej całkowicie NULL kolumny o właściwej nazwie nie powinno zająć wcale czasu ... a następnie usunięcie starej kolumny, zamiast zajmować się milionami wkładek ...
Zack

0

Jeśli otworzysz monitor aktywności SQL podczas działania polecenia, będziesz w stanie stwierdzić, czy faktycznie go przetwarza lub czy czeka na jakąś formę wyłącznej blokady tabeli.

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.