Ich bin mir bewusst, dass beim Hinzufügen neuer Felder zu großen Tabellen empfohlen wird, diese am Ende der Felder und nicht irgendwo in der Mitte hinzuzufügen, und sich zu fragen, ob so etwas beim Ändern von Feldtypen zutrifft.
Ich habe eine Tabelle mit ungefähr einer Million Datensätzen, die mehrere Felder vom Typ VARCHAR enthält. Ich möchte diese in NVARCHAR ändern, aber so wie ich es verstehe, wird dies einige Zeit und Ressourcen in Anspruch nehmen, da sich die Felder in der Mitte der Tabelle befinden und SQL Server einige Kopier- / Neuordnungsvorgänge durchführen muss.
Was ist ein effizienter Weg, um dies zu erreichen?
Antworten:
Bei direkter Beantwortung der Frage gibt es zwei Möglichkeiten, die Operation auszuführen.
Hinweis zu großen Tabellen : Wenn die Tabelle nur wenige Tausend Datensätze oder weniger enthält, können Sie den Vorgang sofort ausführen. Bei Tabellen mit Millionen Datensätzen ist es praktischer, in Stapeln zu arbeiten (sagen wir jedes Mal 1000 oder 100 Datensätze).
Pseudo-temporäre Spalten (ich habe vergessen, ob es einen anderen, passenderen Namen gibt) sind Spalten, in denen das Ergebnis einer Konvertierung gespeichert wird. In diesem Fall wären sie auch die letzten Spalten nach dem Prozess.
Dies ist der gleiche Prozess, der in Aarons Antwort beschrieben wird .
Wenn sich die Änderung in mehr als einer Handvoll Spalten befindet, ist es praktischer, eine neue Tabelle basierend auf dem Schema der alten zu erstellen.
Hinweis zu Schritt 4 : Wenn Sie doppelte Indizes erkannt haben (das Erkennen doppelter Indizes ist ein sehr langes Thema, siehe Kimberly Tripps Blog auf SQLSkills.com), ist dies Ihre Chance, diese zu entfernen, wenn dies der Fall ist.
Der Wechsel von VARCHAR zu NVARCHAR hat einige Auswirkungen auf die Leistung, zumindest für jeden SQL Server unter 2008R2. Für SQL 2008 R2 hat Aaron Bertrand einige Blog-Beiträge zur Unicode-Komprimierungsfunktion, die das Gleichgewicht ausgleichen können, wenn NVarchar-Spalten zum Speichern von Inhalten verwendet werden, die in VARCHAR-Spalten gespeichert werden können. Ich habe sie nicht vollständig gelesen, wie es die Artikel verdienen, aber das Thema ist interessant.
In NVARCHAR-Spalten (IOW, vor 2008R2) werden alle Zeichen in den Spalten mit 2 Byte pro Zeichen gespeichert. Beispielsweise wird die Zeichenfolge 'MSSQL' in 5 Bytes in einer VARCHAR-Spalte und 10 in einer NVARCHAR-Spalte gespeichert. Da Nicht-LOB-Zeichenfolgenspalten maximal 8000 Byte speichern dürfen , bedeutet dies, dass VARCHAR 8000 Zeichen speichern kann, während NVARCHR auf 4000 Zeichen beschränkt ist.
Implikationen dieser Tatsachen:
BEARBEITEN: Wie von gbn angegeben, lohnt es sich nicht, etwas zu erstellen, nur um VARCHARs zu verwenden, wenn Sie eine eindeutige Anforderung haben, bei der NVARCHAR-Spalten vollständig ausgefüllt werden müssen.
quelle
Ein Weg könnte sein:
Dies wird auf lange Sicht nicht schneller sein und erfordert dennoch ein Wartungsfenster (da Sie nicht möchten, dass Benutzer bereits aktualisierte Zeilen aktualisieren, es sei denn, Sie setzen einen temporären Auslöser ein, um dem entgegenzuwirken), verhindert jedoch a Eine große Transaktion und nach ein paar Updates erhalten Sie mehr Vorhersehbarkeit darüber, wie lange es dauern wird.
Sie können das Gleiche tun, indem Sie eine neue Tabelle erstellen und diese umbenennen, sobald dies erledigt ist. Dies vermeidet zwar die Notwendigkeit von Schritt 5, führt jedoch zu einer noch stärkeren Datenabwanderung und kann aufgrund von Einschränkungen, Fremdschlüsseln und Triggern problematischer sein usw., die mit der Tabelle verbunden sein könnten.
quelle