KB2986423 – FIX: Das Hinzufügen neuer Spalten zu einer Tabelle dauert lange, wenn die Zeilengröße die maximal zulässige Größe überschreitet

Gilt für
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

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:

      

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 =1 
    
  • Sie 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.