Symptome
Angenommen, Sie fügen einer Tabelle in Microsoft SQL Server 2012 oder SQL Server 2014 eine Spalte hinzu. Wenn die Größe der Zeile nahe an der maximal zulässigen Größe von 8.060 Byte liegt, kann das Hinzufügen sehr lange dauern.
Ursache
Das Problem tritt auf, weil SQL Server eine vollständige Überprüfung der Tabelle durchführt, wenn die Gesamtgröße der Zeile nahe an der maximal zulässigen Zeilengröße liegt, um sicherzustellen, dass das Hinzufügen einer neuen Spalte nicht gegen die Datenintegrität verstößt. Die Versionen vor SQL Server 2012 führen diese Überprüfung nicht durch, wodurch die Datendefinitionssprache (Data Definition Language, DDL) schneller ausgeführt wird. Dieses Verhalten führt jedoch dazu, dass nachfolgende Vorgänge wie das Aktualisieren oder Verkleinern von Zeilen fehlschlagen, wenn die Zeilengröße die zulässige Größe überschreitet.
Lösung
Mit dem kumulativen Update wird das neue Ablaufverfolgungsflag 647 für das Verhalten der Abwärtskompatibilität eingeführt.
Das Problem wurde erstmals im folgenden kumulativen Update von SQL Server behoben.
Kumulatives Update 38 für SQL Server 2014 /en-us/help/3011055
Kumulatives Update 38 für SQL Server 2012 SP1 /de-de/help/2991533
Kumulatives Update 2 für SQL Server 2012 SP2 /en-us/help/2983175
Informationen zu kumulativen Updates für SQL Server
Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und Sicherheitsfixes, die im vorherigen kumulativen Update enthalten waren. Sehen Sie sich die neuesten kumulativen Updates für SQL Server an:
- Neuestes kumulative Update für SQL Server 2014
- Neuestes kumulatives Update für SQL Server 2012 SP1
- Neuestes kumulative Update für SQL Server 2012 SP2
Weitere Informationen
Sie können das Ablaufverfolgungsflag 647 mithilfe des Startparameters aktivieren. Weitere Informationen finden Sie unter Startoptionen für den Datenbank-Engine-Dienst.
Sie können die folgende Abfrage ausführen (Bitte ersetzen <Sie den Tabellennamen> durch Ihren tatsächlichen Tabellennamen), um die jeweilige Tabelle vor dem Vorgang auf einem Produktionssystem zu testen und die Auswirkungen dieses Problems zu planen. Wenn das Ergebnis größer als 8.060 ist, tritt für Ihre Tabelle dieses Problem auf. Wenn Sie Spalten gelöscht haben, müssen Sie die Tabelle außerdem mit der Option "Neu erstellen" ändern. Das Neuerstellen der Tabelle kann dazu führen, dass die Abfrage korrekte Ergebnisse zurückgibt.
select 1+1+2 + 2 + (case when sum (case when leaf_offset < 0 then 1 else 0 end) > 0 then 2 else 0 end) + ( (count (*) + 7)/8 ) + count (case when leaf_offset < 0 then 1 else null end) * 2 + sum( case when max_length=-1 then 24 else max_length end) from sys.system_internals_partition_columns col join sys.partitions par on col.partition_id = par.partition_id where object_id = object_id ('<table name>') and index_id in (0,1) and partition_number =1Sie können das Hinzufügen von Spalten mit variabler Länge oder Spalten mit geringer Dichte in Betracht ziehen, wenn Ihre Anwendung der Tabelle häufig neue Spalten hinzufügt. Es handelt sich um einen reinen Metadatenvorgang, auch wenn die Gesamtgröße aller Spalten 8.060 Byte überschreitet.
Status
Microsoft hat bestätigt, dass dies ein Problem bei den Microsoft-Produkten ist, die im Abschnitt „Gilt für“ aufgeführt sind.