Sümptomid
Oletagem, et lisate veeru tabelisse Microsoft SQL Server 2012 või SQL Server 2014. Kui rea suurus on 8 060 baitides suurima lubatud suurusega, võib toimingu lisamine võtta kaua aega.
Põhjus
See probleem ilmneb, sest kui rea kogumaht on suurima lubatud rea suuruse lähedal, teeb SQL Server tabeli täieliku skannimise tagamaks, et uue veeru lisamine ei rikuks andmete terviklikkust. Versioonid enne SQL Server 2012 ei tee seda kontrolli ja et andmete määratluse keel (DDL) töötab kiiremini. Kuid selline käitumine põhjustab järgmiste toimingute (nt rea värskendamine või kahandamine) ebaõnnestumist, kui rea maht ületab lubatud mahu.
Lahendus
Kumulatiivne värskendus tutvustab uut jälituslipp 647 tagasiühilduvuse käitumist. Probleem parandati esmakordselt SQL serveri järgmises koondvärskenduses.
Kumulatiivne Update 5 SQL Server 2014 /en-us/help/3011055
Kumulatiivne Update 12 SQL Server 2012 SP1 jaoks /en-us/help/2991533
Kumulatiivne Update 2 SQL Server 2012 SP2 jaoks /en-us/help/2983175
Iga uus koondvärskenduses SQL Server sisaldab kõiki käigultparandused ja kõik turvaparandusi, mis kuulusid eelmise koondvärskenduse. Vaadake SQL serveri kumulatiivseid värskendusi.
Lisateave
-
Jälituslipp 647 saab sisselülitamiseks kasutada startup parameetrit. Lisateavet leiate teemast andmebaasi mootori teenuse käivitamise suvandid.
-
Saate käivitada järgmise päringu (Palun asendage <tabeli nimi> oma tegeliku tabeli nimega), et testida konkreetset tabelit enne operatsiooni tootmissüsteemi ja kavandada selle probleemi mõju. Kui tulem on suurem kui 8 060, kuulub teie tabelile see probleem. Kui olete veergudest loobunud, peate muutma tabelit, mille suvand on uuesti üles ehitatud. Tabeli uuesti koostamine võib muuta päringu tulemid õigeks.
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
-
Saate kaaluda muutuva pikkusega veergude või hõreda veergude lisamist, kui teie rakendus liidab tabelile sageli uued veerud. See on ainult metaandmetega toiming, isegi kui kõigi veergude kogumaht ületab 8 060 baiti.
Olek
Microsoft on kinnitanud, et see probleem esineb jaotises "kehtib järgmiste toodete kohta" loetletud Microsofti toodetes.