Ознаки
Припустимо, що ви додаєте стовпець до таблиці в 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 за допомогою параметра запуску. Докладні відомості наведено в статті Параметри запуску служби обробника баз даних.
-
Ви можете виконати наведений нижче запит (замініть ім'я <таблиці> з іменем дійсної таблиці), щоб перевірити певну таблицю перед операцією в системі виробництва, а також планувати ефект цієї проблеми. Якщо результат більший за 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, перелічених у розділі "застосовується до".