Erhöhen Sie die Geschwindigkeitsänderungsspalte auf der großen Tabelle auf NON NULL

12

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 COLUMNich 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.

Ben Amada
quelle

Antworten:

12

Anstatt CHECK CONSTRAINTdie Spaltendefinition zu ändern, können Sie eine hinzufügen , die keine NULL-Werte für diese Spalte zulässt. Die Tabelle muss weiterhin gescannt werden, es muss jedoch nicht jede einzelne Datenseite geändert werden, sodass eine viel schnellere Operation erfolgen sollte. Leider wird eine Sch-M-Sperre während der Operation noch gehalten. Ein Trick besteht darin, zu versuchen, so viel wie möglich von der Tabelle in den Pufferpool zu bekommen, bevor versucht wird, die Einschränkung hinzuzufügen. Dies kann die Zeitdauer verringern, in der die Sch-M-Sperre gehalten wird.

Sie können dann die Einschränkung entfernen und die Spaltendefinition während Ihres nächsten Wartungsfensters ändern.

Joe Obbish
quelle
Danke Joe für die Idee. Fast hätte ich eine Check-Einschränkung hinzugefügt, aber über das Wochenende hatte ich ein Wartungsfenster und konnte die Spalte so ändern, dass sie nicht auf Null gesetzt werden kann. Ich bin nicht sicher, ob es geholfen hat, aber um zu versuchen, die Tabellendaten in den Pufferpool zu bekommen, kurz bevor die Spalte nicht auf Null gesetzt werden konnte, lief ich, SELECT c1, count(*) FROM t1 GROUP BY c1was ungefähr 9 Minuten dauerte. Die eigentliche ALTER TABLE ALTER COLUMNAussage danach dauerte 25 Minuten. Nicht so schlecht.
Ben Amada
11

Wenn Sie mit Enterprise Edition (EE) arbeiten, besteht eine bessere Strategie möglicherweise darin, diese als NOT NULLStandard 0oder hinzuzufügen 1(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

user126897
quelle
Interessanterweise ist mir diese Funktion in der letzten Woche aufgefallen, als ich getestet habe, wie eine nicht nullfähige Bitspalte mit einem Standardwert zu derselben großen Tabelle auf meinem lokalen Computer hinzugefügt wird, auf dem SQL Developer Edition ausgeführt wird. Die Spalte wurde sofort hinzugefügt, und ich konnte nicht herausfinden, warum . Es später er mir, dass es sein muss, weil Developer Edition EE-Funktionen enthält.
Ben Amada
-3

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.

Razvan Socol
quelle