Ändern der Datentyp von int zu bigint für Tabellen mit Milliarden von Zeilen
Ich habe einige Tabellen mit Millionen, und in einer Tabelle Milliarden Zeilen mit einer Spalte als int nun bin ich einen Wechsel zu bigint. Ich habe versucht, ändern der Datentyp mit SSMS und es ging nach ein paar Stunden als Transaktionsprotokoll voll ist.
Andere Herangehensweise ist das erstellen einer neuen Spalte und begann die Aktualisierung mit dem Wert aus der alten Spalte neue Spalte in den Reihen, durch die Einstellung ROWCOUNT
Eigenschaft 100000, es funktioniert, aber es sehr langsam und es behauptet, die volle server-Speicher. Mit diesem Ansatz kann ein paar Tage dauern, um abzuschließen, und es wird nicht akzeptabel sein in der Produktion.
Was ist die schnelle\beste Weg, um zu ändern Datentyp? Die Spalte "Quelle" ist keine identity-Spalte und doppelte, und ist null erlaubt. Die Tabelle hat einen index, die auf anderen Spalten, wird die Deaktivierung der index wird den Prozess beschleunigen? Wird das hinzufügen von Begin Tran und Commit helfen?
- Brauchen Sie diese als Produktions-Fähigkeit, um ausgeführt werden auf einer regelmäßigen basis? Oder ist das eine einmalige Sache?
- Dies muss nur einmal durchgeführt werden
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lief einen test für die ALTER-SPALTE zeigt, dass die tatsächliche Zeit, die erforderlich ist, um die änderung vorzunehmen. Die Ergebnisse zeigen, dass das ALTER COLUMN ist nicht sofort, und der Zeitaufwand wächst Linear.
Meine Empfehlung wäre, charge, wie Sie vorgeschlagen. Erstellen Sie eine neue Spalte, und pre-Auffüllen der Spalte im Laufe der Zeit mit einer Kombination aus ROWCOUNT und WAITFOR.
Code Ihr Skript so, dass die WAITFOR-Wert aus der Tabelle gelesen. Auf diese Weise können Sie ändern die WAITFOR-Wert on-the-fly, wie Sie Ihre Produktions-server gestartet wird, bremst. Sie verkürzen die WAITFOR-während der off-peak-Stunden. (Sie können auch verwenden, DMVs, um Ihren WAITFOR-Wert automatische, aber dies ist sicherlich komplexer.)
Dies ist ein Komplexes update, das erfordert Planung und viel Babysitten.
Rob
Hier ist der ALTER COLUMN-test-code.
FILLFACTOR=80
(Zeilen wächst von 24 bytes 28, ein Anstieg von ~15%). Es sollte das speichern von SQL-Server-Zuweisung von neuen Seiten. Wiederholen Sie für die anderen Indizes, die Verwendung der neuenBIGINT
Spalte als Schlüssel oder abdecken Spalte.FILLFACTOR=80
: 98,647 mcseinem einfachen
alter table <table> alter column <column> bigint null
nehmen sollte grundsätzlich keine Zeit. es werden keine Probleme bei der Konvertierung oder null prüft - ich sehe nicht, warum dies wäre nicht verhältnismäßig sofortigewenn du es über die GUI, wird es wahrscheinlich versuchen, erstellen Sie eine temporäre Tabelle, löschen Sie die vorhandene Tabelle, und erstellen Sie eine neue - auf jeden Fall nicht, dass