Simptomi
Pieņemiet, ka varat pievienot kolonnu tabulai programmā Microsoft SQL Server 2012 vai SQL Server 2014. Ja rindas lielums ir tuvs maksimālais atļautais lielums, kas ir 8 060 baiti, pievienošanas operācija var aizņemt ilgu laiku.
Cēlonis
Problēma rodas tāpēc, ka, ja rindas kopējais lielums ir tuvs maksimālajiem atļautajiem rindas izmēriem, SQL Server veic pilnu tabulas skenēšanu, lai nodrošinātu, ka tiek pievienota jauna kolonna, kas nepārkāpj datu integritāti. Versijas pirms SQL Server 2012 neveic šo pārbaudi, un tādējādi datu definēšanas valoda (DDL) darbojas ātrāk. Tomēr šī darbība izraisa tādu turpmāko darbību neveiksmes kā rindas atjaunināšana vai samazināšana, ja rindas lielums pārsniedz atļauto lielumu.
Risinājums
Kumulatīvais atjauninājums iepazīstina ar jaunu izsekošanas karodziņu 647 atpakaļsaderības darbībai. Šī problēma pirmo reizi tika izlabota tālāk sniegtajā SQL Server kumulatīvajā atjauninājumā.
Kumulatīvais atjauninājums 5 SQL Server 2014 /en-us/help/3011055
Kumulatīvais atjauninājums 12 SQL Server 2012 SP1 /en-us/help/2991533
SQL Server 2012 SP2 kumulatīvais atjauninājums 2 /en-us/help/2983175
Katrā jaunajā kumulatīvajā SQL Server atjauninājumā ir iekļauti visi labojumfaili un visi drošības labojumi, kas bija iekļauti iepriekšējā kumulatīvajā atjauninājumā. Skatiet jaunākos kumulatīvos atjauninājumus SQL Server:
Papildinformācija
-
Varat ieslēgt izsekošanas karodziņu 647, izmantojot startēšanas parametru. Informāciju skatiet rakstā datu bāzes programmas startēšanas opcijas.
-
Varat izpildīt šādu vaicājumu (Lūdzu, aizstājiet <tabulas nosaukumu> ar faktisko tabulas nosaukumu), lai pārbaudītu konkrētu tabulu pirms operācijas ražošanas sistēmā un plānotu šīs problēmas ietekmi. Ja rezultāts ir lielāks par 8 060, uz jūsu tabulu attiecas šī problēma. Turklāt, ja esat nometuši kolonnas, ir jāmaina tabula ar atjaunošanas opciju. Pārveidojot tabulu, vaicājumam ir jāatgriež pareizs rezultāts.
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
-
Jūs varat apsvērt iespēju pievienot mainīgu garuma kolonnas vai mazapdzīvotas kolonnas, ja lietojumprogrammā bieži tiek pievienotas tabulas ar jaunām kolonnām. Tā ir tikai metadatu operācija pat tad, ja visu kolonnu kopējais lielums pārsniedz 8 060 baitus.
Statusa
Microsoft ir apstiprinājusi, ka šī problēma pastāv Microsoft produktos, kas ir norādīti sadaļā "attiecas uz".