Проблемы
Предположим, что вы добавляете столбец в таблицу в 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 с пакетом обновления 1 (SP1) /en-us/help/2991533
Накопительное обновление 2 для SQL Server 2012 SP2 /en-us/help/2983175
Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Ознакомьтесь с самыми последними накопительными обновлениями для SQL Server.
Дополнительная информация
-
Вы можете включить флаг трассировки 647 с помощью параметра запуска. Дополнительные сведения можно найти в разделе Параметры запуска службы ядраСУБД.
-
Вы можете выполнить следующий запрос (замените <имя таблицы> именем фактической таблицы), чтобы проверить определенную таблицу перед операцией в рабочей системе и спланировать ее влияние. Если результат больше 8 060, в таблице будет налагается эта проблема. Кроме того, если вы удалили столбцы, вам нужно изменить таблицу с помощью параметра REBUILD. Перестройка таблицы может сделать запрос возвращать правильные результаты.
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 байт.
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".