Niedawno dodałem kolumnę bitową obsługującą NULL do tabeli, która ma prawie 500 milionów wierszy. W kolumnie nie ma wartości domyślnej, jednak wszystkie wstawki określają wartość 0 lub 1, a ja uruchomiłem jednorazową procedurę, aby przypisać 0 lub 1 do wszystkich istniejących wierszy (aktualizując wiersze małymi partiami). Każdy wiersz powinien mieć teraz 0 lub 1 w tej kolumnie.
Chcę, aby kolumna bitowa nie miała wartości zerowej, jednak gdy spróbowałem to zrobić ALTER TABLE t1 ALTER COLUMN c1 bit not null
, zaczęła działać przez 3 minuty i zatrzymałem ją, ponieważ blokowała wszystkie odczyty w tabeli i podejrzewałem, że jej ukończenie zajmie dużo czasu . Możliwe, że nie zajmie to zbyt długo, ale nie mogłem zaryzykować zbyt dużej niedostępności. Samo wycofanie zajęło 6 minut.
Czy masz jakieś sugestie na temat tego, jak sprawić, by kolumna nie miała wartości zerowej bez wypełnienia jej potencjalnie godzinami? Ponadto czy jest jakiś sposób oszacowania, ile ALTER TABLE ALTER COLUMN
czasu zajęłoby uruchomienie, a następnie anulowanie wyciągu?
Korzystam z programu SQL Server 2017 Web Edition.
źródło
SELECT c1, count(*) FROM t1 GROUP BY c1
co trwało około 9 minut. Wypełnienie faktycznegoALTER TABLE ALTER COLUMN
oświadczenia zajęło 25 minut. Nieźle.Jeśli korzystasz z wersji Enterprise Edition (EE), lepszą strategią może być dodanie jej w
NOT NULL
wersji domyślnej0
lub1
(w zależności od tego, co jest najczęściej).Jest to zmiana tylko EE w metadanych . Następnie zaktualizuj te, które muszą zostać odwrócone. Oznacza to mniej aktualizacji i nie trzeba zmieniać zerowalności kolumny po zakończeniu. - Martin Smith
źródło
Spróbuj skopiować dane do nowej tabeli, a następnie zmień nazwę. Musisz zadbać o wszelkie ograniczenia i indeksy. To właśnie robi projektant tabeli SSMS, jeśli chcesz zmienić kolejność kolumn (na przykład), ale powinieneś sprawdzić skrypt, aby sprawdzić, czy jest coś, co nie wygląda dobrze.
Podczas kopiowania dostęp do odczytu do tabeli źródłowej nie stanowi problemu, ale jeśli istnieją zapisy, mogą zostać zablokowane lub nie zostać skopiowane, w zależności od poziomu izolacji.
źródło