Symptomer
Anta at du legger til en kolonne i en tabell i Microsoft SQL Server 2012 eller SQL Server-2014. Når størrelsen på raden er nær den maksimale tillatte størrelsen som er 8,060 byte, kan det ta lang tid å legge til operasjonen.
Årsak
Dette problemet oppstår fordi når den totale størrelsen på raden er nær den maksimalt tillatte radstørrelsen, SQL Server utfører en fullstendig skanning av tabellen for å sikre at du legger til en ny kolonne ikke bryter retningslinjene for dataintegritet. Versjoner før SQL Server 2012 ikke gjør denne kontrollen, og som gjør datadefinisjonsspråk (DDL) kjører raskere. Denne virkemåten fører imidlertid til feil i etterfølgende operasjoner som for eksempel rad oppdatering eller redusere Hvis radstørrelsen overstiger tillatt størrelse.
Oppløsning
Den kumulative oppdateringen introduserer en ny sporingsflagg 647 for virkemåte for bakoverkompatibilitet.
Problemet ble først løst i den følgende kumulative oppdateringen av SQL Server.
Kumulativ oppdatering 5 for SQLServer 2014/en-us/help/3011055
Kumulativ oppdatering 12 for SQL Server 2012 SP1/en-us/help/2991533
Samleoppdatering 2 for SQL Server 2012 SP2/en-us/help/2983175
Hver nye kumulative oppdateringen for SQL Server inneholder alle hurtigreparasjonene og alle sikkerhetsreparasjoner som fulgte med den forrige kumulative oppdateringen. Sjekk ut de nyeste kumulative oppdateringene for SQL Server:
Hvis du vil ha mer informasjon
-
Du kan aktivere sporingsflagg 647 ved å bruke oppstartsparameteren. For informasjon, kan du se Database Engine alternativer for tjenesteoppstart.
-
Du kan kjøre følgende spørring (må erstatte < navn > med navnet ditt faktiske tabellen) for å teste den bestemte tabellen før operasjonen på et produksjonssystem, og planlegge virkningen av dette problemet. Hvis resultatet er større enn 8,060, er tabellen utsatt for dette problemet. Hvis du har fjernet kolonner, må du i tillegg endre tabell med alternativet Gjenoppbygg. Gjenoppbygging av tabellen, kan du gjøre spørringen returnerer riktige resultater.
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 vurdere å legge til kolonner med variabel lengde eller sparsommelig når programmet ofte legger til nye kolonner i tabellen. Det er en bare metadata-operasjon selv om den totale størrelsen på alle kolonnene overskrider 8,060 byte.
Status
Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen "Gjelder for".