Симптоми
Приемете, че добавяте колона към таблица в Microsoft SQL Server 2012 или SQL Server 2014. Когато размерът на реда е близък до максималния разрешен размер, който е 8 060 байта, добавянето на операция може да отнеме много време.
Причина
Проблемът възниква, тъй като когато общият размер на реда е близък до максималния разрешен размер на реда, SQL Server прави пълно сканиране на таблицата, за да се уверите, че добавянето на нова колона не нарушава целостта на данните. Версиите преди SQL Server 2012 не правят тази проверка и това улеснява по-бързото стартиране на езика за дефиниране на данни (DDL). Обаче това поведение води до неуспешно изпълнение на последващи операции, като например актуализиране на ред или свиване, ако размерът на реда надвишава позволения размер.
Решение
Кумулативната актуализация въвежда нов флаг за проследяване 647 за поведението на обратна съвместимост. Проблемът е коригиран първо в следващата сборна актуализация на SQL Server.
Сборна актуализация 5 за SQL Server 2014 /en-us/help/3011055
Кумулативна актуализация 12 за SQL Server 2012 SP1 /en-us/help/2991533
Кумулативна актуализация 2 за SQL Server 2012 SP2 /en-us/help/2983175
Всяка нова сборна актуализация за SQL Server съдържа всички поправки и всички корекции на защитата, които са били включени в предишната сборна актуализация. Вижте последните сборни актуализации за SQL Server:
Повече информация
-
Можете да включите флага за проследяване 647 с помощта на параметъра Startup. За информация вижте Опции за стартиране на услугата за двигатели на базата данни.
-
Можете да изпълните следната заявка (Моля, заменете <име на таблица> с истинското име на таблицата), за да тествате конкретната таблица преди операцията в системата за производство и да планирате ефекта от този проблем. Ако резултатът е по-голям от 8 060, вашата таблица подлежи на този проблем. Освен това, ако сте изпуснали колони, трябва да промените таблицата с опция за повторно създаване. Възстановяването на таблицата може да накара заявката да върне правилните резултати.
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
-
Можете да помислите за добавяне на колони с променлива дължина или откъслечни колони, когато приложението често добавя нови колони в таблицата. Това е операция само за метаданни, дори ако общият размер на всички колони надвишава 8 060 байта.
Състоянието
Microsoft потвърди, че това е проблем в продуктите на Microsoft, които са посочени в секцията "важи за".