Simptomi
Pretpostavimo da ste dodali kolonu u tabelu u sistemu Microsoft SQL Server 2012 ili SQL Server 2014. Kada je veličina reda blizu maksimalne dozvoljene veličine koja je 8.060 bajtova, operacija dodavanja može potrajati dugo.
Uzrok
Do problema dolazi zato što, kada je ukupna veličina reda blizu maksimalne dozvoljene veličine reda, SQL Server izvrši potpuno skeniranje tabele da bi se uverio da dodavanje nove kolone ne narušava integritet podataka. Verzije pre sql Server 2012 ne proveravaju ovu proveru i to čini da jezik definicije podataka (DDL) radi brže. Međutim, ovo ponašanje rezultira neuspehom narednih operacija kao što je ažuriranje ili smanjivanje redova ako veličina reda premašuje dozvoljenu veličinu.
Rešenje
Kumulativna ispravka uvodi novu zastavicu za praćenje 647 za ponašanje kompatibilnosti unazad. Problem je prvi put otklonjen u sledećoj kumulativnoj ispravki sistema SQL Server.
Kumulativna ispravka 5 za SQL Server 2014 /en-us/help/3011055
Kumulativna ispravka 12 za SQL Server 2012 SP1 /en-us/help/2991533
Kumulativna ispravka 2 za SQL Server 2012 SP2 /en-us/help/2983175
Svaka nova kumulativna ispravka za SQL Server sadrži sve hitne ispravke i sve bezbednosne ispravke koje su bile uključene u prethodnu kumulativnu ispravku. Pogledajte najnovije kumulativne ispravke za SQL Server:
Više informacija
-
Zastavicu za praćenje 647 možete da uključite pomoću parametra za pokretanje. Više informacija potražite u članku Opcije pokretanja usluge mašine baze podataka.
-
Možete da pokrenete sledeći upit (zamenite <ime> tabele pravim imenom tabele) da biste testirali određenu tabelu pre operacije na proizvodnom sistemu i isplanirali efekat ovog problema. Ako je rezultat veći od 8.060, vaša tabela podleže ovom problemu. Pored toga, ako ste ispustili kolone, morate da promenite tabelu sa opcijom ponovnog izbora. Ponovno pravljenje tabele može da učini da upit vrati ispravne rezultate.
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
-
Možete razmotriti dodavanje kolona promenljive dužine ili proređenih kolona kada aplikacija često dodaje nove kolone u tabelu. To je operacija samo za metapodatke čak i ako ukupna veličina svih kolona premašuje 8.060 bajtova.
Status
Microsoft je potvrdio da je ovo problem u Microsoft proizvodima koji su navedeni u odeljku "Odnosi se na".