KB2986423 – ÅTGÄRDAT: Det tar lång tid att lägga till nya kolumner i en tabell när radstorleken överskrider den maximala tillåtna storleken

Gäller 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

Symptom

Anta att du lägger till en kolumn i en tabell i Microsoft SQL Server 2012 eller SQL Server 2014. När radstorleken är nära den maximala tillåtna storleken, d.v.s. 8 060 byte, kan det ta lång tid att lägga till.

Orsak

Problemet uppstår eftersom, när den totala radstorleken är nära den maximala tillåtna radstorleken, gör SQL Server en fullständig genomsökning av tabellen för att se till att lägga till en ny kolumn inte bryter mot dataintegriteten. Versionerna före SQL Server 2012 gör inte den här kontrollen och det gör att DDL (Data Definition Language) körs snabbare. Det här beteendet resulterar dock i fel för efterföljande åtgärder, till exempel raduppdatering eller krympning om radstorleken överskrider den tillåtna storleken.

Lösning

Den kumulativa uppdateringen introducerar en ny spårningsflagga 647 för bakåtkompatibilitetsbeteende.
Problemet åtgärdades först i följande kumulativa uppdatering av SQL Server.

Kumulativ uppdatering 5 för SQL Server 2014 /en-us/help/3011055

Kumulativ uppdatering 12 för SQL Server 2012 SP1 /en-us/help/2991533

Kumulativ uppdatering 2 för SQL Server 2012 SP2 /en-us/help/2983175

Om kumulativa uppdateringar för SQL Server

Varje ny kumulativ uppdatering för SQL Server innehåller alla snabbkorrigeringar och alla säkerhetskorrigeringar som ingick i den tidigare kumulativa uppdateringen. Kolla in de senaste kumulativa uppdateringarna för SQL Server:

      

Mer information

  • Du kan aktivera spårningsflaggan 647 med hjälp av startparametern. Mer information finns i Startalternativ för Database Engine-tjänsten.

  • Du kan köra följande fråga (Ersätt <tabellnamnet> med det faktiska tabellnamnet) för att testa den specifika tabellen före åtgärden på ett produktionssystem och planera effekten av det här problemet. Om resultatet är större än 8 060 beror det här problemet på tabellen. Om du har tagit bort kolumner måste du dessutom ändra tabellen med alternativet Återskapa. Återskapa tabellen kan göra att frågan returnerar rätt resultat.

    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 
    
  • Du kan lägga till kolumner med variabel längd eller glesa kolumner när programmet ofta lägger till nya kolumner i tabellen. Det är en åtgärd för endast metadata, även om den totala storleken på alla kolumner överskrider 8 060 byte.

      

Status

Microsoft har bekräftat att detta är ett problem i de Microsoft-produkter som anges i avsnittet "Gäller".