Hinzufügen von Spalten mit default-Wert zu große Tabelle
Ich habe eine Tabelle mit 40mil records. Ich muss hinzufügen eines neuen INT not NULL-Spalte der Tabelle, mit Standardwert = 0
Beim hinzufügen dieser Spalte, und verwenden Sie die folgenden:
ALTER TABLE myTable ADD NewColumnID int NOT NULL CONSTRAINT DF_Constraint DEFAULT 0
Er stellt die NewColumnID 0 für alle Datensätze. Beim ausführen dieser Abfrage auf unserer prod Tabelle, die 40mil records, wird das lange dauern? Weil ich weiß, tun die folgende SEHR LANGE dauert:
UPDATE myTable SET NewColumnID = 0
- Und Ihre Frage ist ?
- Es ist lang und es scheint normal.
- Sie könnte... das hinzufügen der Spalte 'NULL', und aktualisieren Sie dann die Tabelle noch ein wenig in einer Zeit
- Wie kann Sie nicht wissen, ob das hinzufügen der Feld dauert eine lange Zeit, wenn Sie wissen aktualisieren es funktioniert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das große problem ist, dass dieses schreiben muss um jede einzelne Zeile, die stark protokolliert und als eine einzige Transaktion. Ein Weg, um zu minimieren die Auswirkungen auf das Protokoll (und das funktioniert am besten, wenn Sie nicht dumm 10% vergrößert-Einstellungen auf Ihre log-Datei) zu brechen, bis die arbeiten soweit wie möglich:
fügen Sie eine null-Spalte:
Update Zeilen in einer batch, sagen wir 10K Zeilen gleichzeitig (dies minimiert log-Auswirkungen - siehe dieser blog-post für hintergrund):
Hinzufügen einer check-Einschränkung (sehen Sie diese Antworten für mehr Details):
Können Sie Zeit sparen, indem
NOCHECK
hier, aber wie Martin erklärte in seiner Antwort, dass ist ein einmalige Einsparungen, die Sie Kosten könnte viel von Kopfschmerzen über längere Sicht.Diese gerichtet war, in diese Vorherige Frage, aber die akzeptierte Antwort gibt, nutzt NOCHECK ohne Haftungsausschluss darüber, wie eine nicht Vertrauenswürdige Einschränkung kann Auswirkungen auf die Ausführung der Pläne.
Die Zeit, die für eine update-Abfrage ausführen, ist völlig abhängig von der zugrunde liegenden hardware und keiner hier kann Ihnen eine klare Antwort. Aktualisieren von 40 Millionen Datensätzen könnte Sekunden dauern oder Tage, abhängig von der hardware.. speziell, Menge an RAM in der Maschine und die Geschwindigkeit der Festplatten.
Sagte, dass, wenn ein einfaches update, wie Sie gezeigt, nimmt eine "SEHR LANGE ZEIT" dann eine alter-Anweisung wird wahrscheinlich so lange dauern oder länger.
Nicht, wie der SQL Server 2012, dieser wird sofort funktionieren:
http://rusanu.com/2011/07/13/online-non-null-with-values-column-add-in-sql-server-11/
Wenn Sie behandeln können
NULL
als0
man könnte hinzufügen, dass es da eine Spalte mit geringer Dichte - würde es nicht brauchen, um hinzuzufügen, jede Lagerung, bis Sie tatsächlich Hinzugefügt, Wert:Sonst Aarons Ansatz ist wahrscheinlich die am wenigsten aufdringlich - es wird noch eine lange Zeit dauern, aber es kann getan werden "online"
Es besser für drop die Spalten, und wieder Hinzugefügt. das wird minimieren Sie alle overhead wie ein trigger oder constraints über den Tisch.
Danke Aaron für deine ausführliche Ansatz, aber ich habe einen schnellen test und die einfache Methode wäre die folgende:
Einige Hintergrundinformationen. Ich bin das hinzufügen einer CompanyID, um eine vorhandene Tabelle. Die ID bezieht sich auf die Firma der Datensatz gehört. Default-Wert 0 sein. Da dieser aber geht in einen bestehenden Kunden prod-Datenbank, Ihre Unternehmens-ID ist 1. Wir haben eine generische upgrade-Skript für alle unsere Kunden, stellt sich heraus, eine leichte Modifikation dieses Skript für diesen spezifischen Kunden-Gewinnung erhebliche performance-Verbesserungen.
STATT:
ICH NUR DAZU:
Dann einfach den default-Wert auf 0 zurück. Nun die Tabelle CompanyID = 1 für alle Datensätze. BOOM!