Ошибка: 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    129759    700    390    

752

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Перенос данных 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    7020    dsdred    60    

88

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

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

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

1 стартмани

15.02.2024    8915    175    ZAOSTG    74    

104

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

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

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

11.10.2023    17010    skovpin_sa    14    

102

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

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

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

20.06.2023    18326    Филин    37    

114

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

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

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

14.06.2023    14297    AlexKriulin    9    

88

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

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

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

17.03.2023    39997    kuzyara    87    

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