Symptomen
Stel dat u een kolom toevoegt aan een tabel in Microsoft SQL Server 2012 of SQL Server 2014. Wanneer de grootte van de rij dicht bij de maximaal toegestane grootte 8.060 bytes valt, kan het enige tijd duren voor het toevoegen van de rij.
Oorzaak
Het probleem kan zich voordoen omdat, wanneer de totale lengte van de rij dicht bij de maximaal toegestane Rijgrootte valt, SQL Server een volledige scan uitvoert van de tabel om ervoor te zorgen dat het toevoegen van een nieuwe kolom niet schendt voor de gegevensintegriteit. De versies vóór SQL Server 2012 doen deze controle niet plaats en Hiermee wordt DDL (Data Definition Language) sneller uitgevoerd. Dit gedrag levert echter wel het mislukken van verdere bewerkingen op, zoals het bijwerken of verkleinen van de Rijgrootte als de grootte van de rij groter is dan de toegestane grootte.
Oplossing
Met de cumulatieve update wordt een nieuwe traceringsvlag 647 geïntroduceerd voor achterwaartse compatibiliteit. Het probleem is voor het eerst opgelost in de volgende cumulatieve update van SQL Server.
Cumulatieve update 5 voor SQL Server 2014 /en-us/help/3011055
Cumulatieve update 12 voor SQL Server 2012 SP1 /en-us/help/2991533
Cumulatieve update 2 voor SQL Server 2012 SP2 /en-us/help/2983175
Elke nieuwe cumulatieve update voor SQL Server bevat alle hotfixes en alle beveiligingsoplossingen die zijn opgenomen in de vorige cumulatieve update. Bekijk de nieuwste cumulatieve updates voor SQL Server:
Meer informatie
-
U kunt de traceringsvlag 647 inschakelen met behulp van de opstartparameter. Zie opstartopties voor de database-engine servicevoor informatie.
-
U kunt de volgende query uitvoeren (Vervang <tabelnaam> door uw werkelijke tabelnaam) om de bepaalde tabel vóór de bewerking op een productiesysteem te testen en het effect van dit probleem te plannen. Als het resultaat groter is dan 8.060, is de tabel onderhevig aan dit probleem. Als u kolommen hebt neergezet, moet u de tabel met de optie opnieuw opbouwen wijzigen. Als u de tabel opnieuw bouwt, kan de query de juiste resultaten krijgen.
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
-
U kunt overwegen om kolommen met een variabele lengte of sparse kolommen toe te voegen wanneer de toepassing regelmatig nieuwe kolommen aan de tabel toevoegt. Het is een bewerking met metagegevens, zelfs als de totale grootte van alle kolommen groter is dan 8.060 bytes.
Status
Microsoft heeft bevestigd dat dit probleem zich kan voordoen in de Microsoft-producten die worden vermeld in de sectie Van toepassing op.