Simptome
Să presupunem că adăugați o coloană la un tabel în Microsoft SQL Server 2012 sau SQL Server 2014. Atunci când dimensiunea rândului este aproape de dimensiunea maximă permisă care este 8.060 bytes, operațiunea de Adăugare poate dura mult timp.
Cauză
Problema apare deoarece, când dimensiunea totală a rândului este aproape de dimensiunea de rând maximă permisă, SQL Server efectuează o scanare completă a tabelului, pentru a vă asigura că adăugarea unei coloane noi nu încalcă integritatea datelor. Versiunile înainte de SQL Server 2012 nu fac acest lucru, iar acest lucru face ca limba definiției date (DDL) să ruleze mai rapid. Cu toate acestea, acest comportament are ca rezultat eșecul operațiunilor ulterioare, cum ar fi actualizarea rândurilor sau micșorarea, dacă dimensiunea rândului depășește dimensiunea permisă.
Rezolvare
Actualizarea cumulativă introduce un nou semnalizator de urmărire 647 pentru comportament de compatibilitate inversă. Problema a fost remediată pentru prima dată în următoarea actualizare cumulativă de SQL Server.
Actualizarea cumulativă 5 pentru SQL Server 2014 /en-us/help/3011055
Actualizare cumulativă 12 pentru SQL Server 2012 SP1 /en-us/help/2991533
Actualizarea cumulativă 2 pentru SQL Server 2012 SP2 /en-us/help/2983175
Fiecare nouă actualizare cumulativă pentru SQL Server conține toate remedierile rapide și toate remedierile de securitate care au fost incluse în actualizarea cumulativă anterioară. Consultați cele mai recente actualizări cumulative pentru SQL Server:
Mai multe informații
-
Puteți să activați semnalizatorul de urmărire 647 utilizând parametrul Startup. Pentru informații, consultați opțiunile de pornire a serviciului motor de baze de date.
-
Puteți rula următoarea interogare (vă rugăm să înlocuiți <nume tabel> cu numele de tabel real) pentru a testa tabelul respectiv înainte de operațiunea unui sistem de producție și a planifica efectul acestei probleme. Dacă rezultatul este mai mare decât 8.060, tabelul este supus acestei probleme. În plus, dacă ați renunțat la coloane, trebuie să modificați tabelul cu opțiunea reconstruire. Reconstruirea tabelului poate face ca interogarea să returneze rezultate corecte.
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
-
Puteți lua în considerare adăugarea coloanelor de lungime variabilă sau a coloanelor rare atunci când aplicația adaugă frecvent coloane noi la tabel. Este o operațiune doar pentru metadate, chiar dacă dimensiunea totală a tuturor coloanelor depășește 8.060 bytes.
Stare
Microsoft a confirmat că aceasta este o problemă în produsele Microsoft enumerate în secțiunea „Se aplică la”.