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

24.10.23

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

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

Скачать исходный код

Наименование Файл Версия Размер
Для спонсоров, которым помогла статья творить доброе-вечное.
.jpg 257,03Kb
0
.jpg 257,03Kb Скачать

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

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

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

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

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

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

10000 руб.

02.09.2020    127262    689    389    

740

Анализируем SQL сервер глазами 1С-ника

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

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

1 стартмани

15.02.2024    8516    170    ZAOSTG    74    

102

Начните уже использовать хранилище запросов

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

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

11.10.2023    16731    skovpin_sa    14    

101

MS SQL Server: изучаем планы запросов

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

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

20.06.2023    17401    Филин    37    

114

tempdb, почему она всё время растет?

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

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

14.06.2023    13655    AlexKriulin    9    

87

Все консоли запросов для 1С

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

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

17.03.2023    38285    kuzyara    87    

182

Пример многопоточной обработки (БСП)

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

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

13.02.2023    9559    7    echo77    8    

93
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 135 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 не позволял больше таблиц соединять.
Оставьте свое сообщение