Kürzlich habe ich einer Tabelle mit fast 500 Millionen Zeilen eine NULL-fähige Bitspalte hinzugefügt. Es gibt keine Standardeinstellung für die Spalte, jedoch geben alle Einfügungen den Wert 0 oder 1 an, und ich habe eine einmalige Routine ausgeführt, um allen vorhandenen Zeilen 0 oder 1 zuzuweisen (Aktualisierung der Zeilen in kleinen Stapeln). Jede Zeile sollte jetzt eine 0 oder 1 in dieser Spalte haben.
Ich möchte, dass die Bit-Spalte nicht auf Null gesetzt wird. Als ich dies jedoch über versuchte ALTER TABLE t1 ALTER COLUMN c1 bit not null
, lief sie 3 Minuten lang und ich habe sie gestoppt, weil alle Lesevorgänge für die Tabelle blockiert wurden und ich vermutete, dass der Abschluss lange dauern würde . Es ist möglich, dass es nicht zu lange dauert, aber ich könnte nicht zu viel Nichtverfügbarkeit riskieren. Das Rollback selbst dauerte 6 Minuten.
Haben Sie Vorschläge, wie ich die Spalte nicht nullfähig machen kann, ohne dass dies möglicherweise Stunden in Anspruch nimmt? Kann ALTER TABLE ALTER COLUMN
ich außerdem abschätzen, wie lange es dauern würde, bis die von mir gestartete und dann stornierte Abrechnung abgeschlossen ist?
Ich verwende SQL Server 2017 Web Edition.
quelle
SELECT c1, count(*) FROM t1 GROUP BY c1
was ungefähr 9 Minuten dauerte. Die eigentlicheALTER TABLE ALTER COLUMN
Aussage danach dauerte 25 Minuten. Nicht so schlecht.Wenn Sie mit Enterprise Edition (EE) arbeiten, besteht eine bessere Strategie möglicherweise darin, diese als
NOT NULL
Standard0
oder hinzuzufügen1
(je nachdem, was am häufigsten vorkommt).Dies ist eine reine Metadatenänderung in EE . Aktualisieren Sie dann diejenigen, die umgedreht werden müssen. Dies bedeutet weniger Aktualisierungen und keine Notwendigkeit, die Spaltennullfähigkeit zu ändern, wenn Sie fertig sind. - Martin-Smith
quelle
Versuchen Sie, die Daten in eine neue Tabelle zu kopieren, und benennen Sie sie dann um. Sie müssen sich um Einschränkungen und Indizes kümmern. Das macht der SSMS-Tabellendesigner, wenn Sie beispielsweise die Spalten neu anordnen möchten, aber Sie sollten das Skript überprüfen, um festzustellen, ob etwas nicht richtig aussieht.
Während des Kopiervorgangs ist der Lesezugriff auf die Quellentabelle kein Problem. Wenn jedoch Schreibvorgänge vorhanden sind, werden diese je nach Isolationsstufe möglicherweise blockiert oder nicht kopiert.
quelle