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 de maximaal toegestane grootte van 8060 bytes bijna heeft bereikt, kan het toevoegen lang duren.
Oorzaak
Het probleem treedt op omdat, wanneer de totale lengte van de rij dicht bij de maximaal toegestane rijgrootte ligt, SQL Server een volledige scan van de tabel uitvoert om te controleren of het toevoegen van een nieuwe kolom de gegevensintegriteit niet schendt. In de versies vóór SQL Server 2012 wordt deze controle niet uitgevoerd, waardoor de DDL (Data Definition Language) sneller wordt uitgevoerd. Dit gedrag leidt er echter toe dat volgende bewerkingen, zoals het bijwerken of verkleinen van de rij, mislukken als de rij groter is dan de toegestane grootte.
Oplossing
De cumulatieve update introduceert een nieuwe traceringsvlag, 647, voor achterwaarts compatibiliteitsgedrag.
Het probleem werd voor het eerst opgelost in de volgende cumulatieve update van SQL Server.
Cumulatieve update 5 voor SQL Server 2014 /nl-nl/help/3011055
Cumulatieve update 12 voor SQL Server 2012 SP1 /nl-nl/help/2991533
Cumulatieve update 2 voor SQL Server 2012 SP2 /nl-nl/help/2983175
Informatie over cumulatieve updates voor SQL Server
Elke nieuwe cumulatieve update voor SQL Server bevat alle hotfixes en alle beveiligingspatches die deel uitmaakten van de vorige cumulatieve update. Bekijk de meest recente cumulatieve updates voor SQL Server:
- Meest recente cumulatieve update voor SQL Server 2014
- Laatste cumulatieve update voor SQL Server 2012 SP1
- Laatste cumulatieve update voor SQL Server 2012 SP2
Meer informatie
U kunt traceringsvlag 647 inschakelen met behulp van de opstartparameter. Zie Opstartopties voor database-engineservice voor meer informatie.
U kunt de volgende query uitvoeren (vervang <de tabelnaam> door de werkelijke tabelnaam) om de specifieke tabel te testen voordat u deze bewerking uitvoert op een productiesysteem en om het effect van dit probleem te plannen. Als het resultaat groter is dan 8060, is dit probleem onderhevig aan de tabel. Als u kolommen hebt weggelaten, moet u bovendien de tabel wijzigen met de optie voor opnieuw samenstellen. Als u de tabel opnieuw opbouwt, kan de query correcte resultaten opleveren.
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 =1U kunt overwegen kolommen met variabele lengte of schaarse kolommen toe te voegen wanneer uw toepassing vaak nieuwe kolommen aan de tabel toevoegt. Het is een bewerking met alleen metagegevens, zelfs als de totale grootte van alle kolommen groter is dan 8.060 bytes.
Status
Microsoft heeft bevestigd dat dit een probleem is bij de Microsoft-producten die worden vermeld in het gedeelte 'Van toepassing op'.