Ошибка: Microsoft SQL Cannot create a row of size

24.10.23

База данных - HighLoad оптимизация

Разбор исправления ошибки "Microsoft SQL Cannot create a row of size" в 1С при открытии формы.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Для спонсоров, которым помогла статья творить доброе-вечное.
.jpg 257,03Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Статья вряд ли заинтересует правоверных джедаев, но может пригодится для олдфагов вроде меня, использующих тёмную силу "загугли" и "копипаста". 

Итак, при входе на определенную форму с динамическим списком получаем ошибку:

Microsoft SQL Cannot create a row of size 8077 which is greater than the allowatte maximum row size of 8066

Типа, длина записи в таблице MS SQL не может превышать размера страницы - 8 кб.

Ошибки нет в PosgreSQL, где варится тестовая база. Но переход рабочей базы на PSQL не рассматривается по религиозным причинам. Ошибка произвольно появлялась то у одного, то у другого пользователя и далее уходить не собиралась. Трассировка ничего не дала, а в консоли запросов ошибки не было. В консоли запросов у конкретного пользователя с ошибкой даже и результата не было, только пустые колонки, но ошибка при открытии формы - была.

По советам трудящихся "возвертай всё взад, <падший ангел апокалипсиса>" вернул исходный запрос и с удивлением обнаружил, что лучше не стало. Истерически паникуя с воплями "Шеф, шеф, всё пропало!", обращаемся к вселенскому разуму.

 

Запрос просто не может генерировать Армагеддон.

 

Помощь бывалого админа сервера 1С была неоценимой: "Запрос слишком большой, превышающий максимальный запрос для SQL. В 1С есть трассировка <а мужики то и не знали>. Надо исправить запрос." Спасибо, Кэп! Другой правоверный прогер сказал, что что-то такое было и после исправления дюжины ошибок в монструозном запросе, полегчало, но у меня не тот случай.

В интернете про эту проблему ничишуя толком не нашел. Походу в гугле забанили, ибо обнаружил только какие-то мантры сенсеев про то что, запрос, написанный нами, и отправленный от 1С к серверу отличается нюансами (см. анекдот про Василия Ивановича, Петьку и нюанс). Они явно о чём-то знали. Но путь ситха джедая усеян горами трупов из ошибок и обработок.

 

На infostart, на форумах 1С, на форумах Axapta сенсеи говорят одно и то же: резать запрос.

 

В ходе долгих поисков по тырнету в очередной раз прочитал очевидное от сенсеев: 1С под капотом подрубает к запросу всякуюкуну внутренние запросы, например, сортировки на форме.

 

Содержимое запроса, вызывающее взрыв радиатора SQL под капотом 1С.

 

Звонок юзеру про сортировку - активно юзает. Бинго. В 1С Предприятие удаляем настройки формы - по-ба-ба-м... ошибка исчезает... На всякий случай, в 1С:УТ11 это делается через 1С Предприятие в панели "НСИ и Администрирование", далее "Настройки пользователей и прав", "Персональные настройки пользователей", "Настройки пользователей". У нужного пользователя я жамкнул "Очистить всё" и позже пожалел, потому что удалились настройки очень важных отчетов, а что там было, никто не помнит. Поэтому надо выбирать конкретную форму и нажимать "Очистить".

 

Магия 1С

 

Ошибки нет! Но ненадолго... Стоит отсортировать по колонке - 1С даёт пинка под зад. Но мы на верном пути - печень не обманет. Она нутром чует.

Но запрос крохотный как мои достижения, в то время как ошибка вылезает явно из-за огромного как мои амбиции select-a. Стопудовые запросы в тридцатью таблицами почему-то не вылетают, как фанера над Парижем, а крохотный запрос вызывает эффект Челябинского метеорита.

Значит, что-то кроме сортировки в форме добавляет адынэс. Смотрим на используемые реквизиты, которые вытягиваются запросом. И тут находим золотую жилу с типом:

ДокументСсылка.

Но судя по соцопросам, используется всего пара документов. Меняем реквизит ДокументСсылка на ДокументСсылка.НашСамыйГлавныйДокумент, а СправочникСсылка удаляем вообще совсем нафиг навсегда. Ошибка исчезает.

 

 

Бонусом идёт ускорение запроса и мгновенное ускорение открытия формы. Профит. С ноги открываем дверь в чат корешей, требуем пива и королевских почестей.

"А почему вообще вдруг возникла ошибка?" - вопросит внимательный читатель: "Ведь до какого-то момента всё летало нормально." Всё верно, просто новые справочники и документы растут как грибы-мутанты после кислотного дождя. И случилось неочевидное - после добавления нового мелкого справочника MS SQL подняла бунд.

1С8 Ошибка Microsoft SQL Cannot create a row of size

См. также

SALE! %

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 10000 руб.

02.09.2020    161238    892    399    

872

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

2 стартмани

15.02.2024    12592    250    ZAOSTG    83    

115

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    19500    skovpin_sa    15    

105

Запросы HighLoad оптимизация Программист Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    28767    Филин    37    

118

Администрирование СУБД Мониторинг Системный администратор Бесплатно (free)

С проблемами распухания tempdb при работе с базой данных 1С регулярно сталкиваются и админы, и разработчики. О том, как мониторить, диагностировать и решать такие проблемы, на конференции Infostart Event 2021 Moscow Premiere рассказал Александр Криулин.

14.06.2023    20658    AlexKriulin    9    

92

Запросы Инструментарий разработчика Программист Бесплатно (free)

Список всех популярных обработок.

17.03.2023    61676    kuzyara    89    

191
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. paulwist 26.10.23 10:02 Сейчас в теме
"А почему вообще вдруг возникла ошибка?" - вопросит внимательный читатель: .... MS SQL подняла бунд.

Дык, "MS SQL подняла бунд" - это разве ответ, вы нашли причину?

Почему возникла такая ошибка?

Если нашли, то приведите репро-код (скрипт T-SQL) показывающий косяк!!!

А то получается статья "ни о чём" ;)
2. vakham 21 27.10.23 13:04 Сейчас в теме
(1) длина записи в таблице MS SQL не может превышать размера страницы - 8 кб.
И это всё, что доступно мне, ибо доступ в MS SQL мне закрыт. И админам закрыт. ;) (админам, Карл!)
3. paulwist 27.10.23 14:00 Сейчас в теме
В интернете про эту проблему ничишуя толком не нашел. Походу в гугле забанили,


Эта проблема гуглится за 5 сек с репро-кодом.

Cannot create a row of size XXXX which is greater than the allowable maximum row size of 8060

Но запрос крохотный как мои достижения, в то время как ошибка вылезает явно из-за огромного как мои амбиции select-a.


Поскольку, запрос (скрипт работы выборки) в статье не приведён, то ... "вангую", создаётся таблица/временная таблица/таблевар в которой длина строки больше 8К, в которую осуществляется попытка записать строку для формирования конечного результата.

Вынуть select-ом запись больше 8К нет проблем (те же n/varchar(max) -->> 2G ) и отдать её клиенту, поэтому сам select ни при чём, в MSSQL нет ограничения на количество "таблиц" в join, хоть 250.

И это всё, что доступно мне, ибо доступ в MS SQL мне закрыт. И админам закрыт.


То есть вы искали/исправляли/тестировали косяк на продуктиве?? Однако :)
4. lvictor58 137 02.11.23 10:06 Сейчас в теме
Скорей всего из-за того что начинает маслаться одновременно много таблиц. В конфигурациях на ОФ были запросы по отборам определенных реквизитов (например "Организация") из всех документов, где такой реквизит присутствует. Запрос строился в цикле с соединением таблиц. Так вот там если количество таких таблиц превышало 256 то цикл принудительно обрывался. И запускался по новой для формирования нового текста запроса по оставшимся.
В УФ либо команда разработчиков даже не задумывалась об этом, либо понадеялись на "авось".
5. paulwist 02.11.23 11:52 Сейчас в теме
Скорей всего из-за того что начинает маслаться одновременно много таблиц.


Соединяю 300 таблиц * 4000 байт в каждой, итого 120 000 байт в конечной выборке и где ошибка Cannot create a row??

-- что-то местный парсер ключевые слова create/select/from разделяет пробелами :)
cre ate      table #t (id char(4000));

declare 
@str varchar(max) = 'sel ect * fr om #t t0',
@i int = 0;

while @i < 300
begin
	set @i = @i + 1
	set @str = @str + ' inner join #t t' + cast(@i as char(4)) + ' on t' + cast(@i - 1 as char(4)) + '.id = t' + cast(@i as char(4)) + '.id'
end

exec (@str)
Показать


PS можно вместо 300 поставить 1000, сам запрос будет долго выполняться ~ 1.5 мин.

PSS ограничение 256 таблиц "растёт" от dbf, там драйвер ODBC не позволял больше таблиц соединять.
Оставьте свое сообщение